strcpy()导致从'const char *'到'char *'的无效转换[-fpermissive]

时间:2014-06-10 07:37:31

标签: c++ constructor const destructor strcpy

我试图让一个名为PReader的对象(带有一个名为Execute()的函数,不带参数)有一个通过构造函数传入的文件名,因此Execute()可以访问它。我尝试设置它的方法包括让构造函数为字符串分配内存,然后将其复制,并为其设置析构函数。我知道这很尴尬,但我知道这个设置会使我项目的未来添加更容易。

这里是我的对象当前是如何设置的:

#include <PReader.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

PReader::PReader(const char *f)
{
    filename = new char[strlen(f)+1];
    strcpy(filename, f);
}

PReader::~PReader()
{
    delete [] filename;
}

void PReader::Execute(void)
{
    FILE *f = fopen(this->filename, "rb");
    ...
}

这给了我错误:

PReader.C: In constructor ‘PReader::PReader(char*)’:
PReader.C:10:20: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
  strcpy(filename, f);
                    ^
In file included from /usr/include/stdlib.h:11:0,
                 from PReader.C:2:
/usr/include/string.h:30:8: error:   initializing argument 1 of ‘char* strcpy(char*, const char*)’ [-fpermissive]
 char  *_EXFUN(strcpy,(char *__restrict, const char *__restrict));

对于如此少的代码行,我有点惊讶我在这里遗漏了一些东西。我可以做些什么来确保转换成功,我想要它?

编辑:PReader.h:

#include "source.h"

#ifndef PREADER_H
#define PREADER_H

class PReader : public Source
{
    public:
        const char* filename;
        PReader(const char *filename);
        virtual ~PReader();
        virtual void Execute();
};

#endif

3 个答案:

答案 0 :(得分:6)

您似乎将filename定义为const char*。改为char*,以便您可以实际修改它(使用strcpy):

char* filename;

或者更好,因为这是C ++,为什么不使用std::string

答案 1 :(得分:1)

这两个声明之间存在差异

const char * filename;

char * const  filename;

第一个声明指向类型为const char的常量对象的指针。指针本身可以更改为例如++filename,但指针指向的对象可能不会更改,例如++*filename。所以你不能在函数std::strcpy中使用这样的指针作为第一个参数。

第二个声明一个指向非常量对象的常量指针。因此指针本身可能不会改变。例如,编译器将为表达式++filename发出错误。但是您可以更改指针指向的对象。例如++*filename;这样的指针可以用作函数std::strcpy中的第一个参数。

最后,您可以定义指向非常量对象的非常量指针

char * filename;

在这种情况下,您可以更改指针本身并更改指针指向的对象。

所以在你的班级中,ypu应该将filename定义为

char * const  filename;

char * filename;

考虑到指针可以定义为

const char * const  filename = "String Literal";

这个语句定义了一个指向常量对象的常量指针。您既不能更改指针本身,也不能更改指针所指向的对象。

等效声明是

const char * constexpr  filename = "String Literal";

答案 2 :(得分:0)

在标题中,您有

const char* filename;

你正试图strcpy进入它。这是不允许的。将其更改为

char* filename;