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

use*_*712 2 c++ constructor destructor const 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");
    ...
}
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

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));
Run Code Online (Sandbox Code Playgroud)

对于如此少的代码行,我有点惊讶我在这里遗漏了一些东西.我该怎么做才能确保转换成功如何?

编辑: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
Run Code Online (Sandbox Code Playgroud)

San*_*ker 6

看起来你定义filename为一个const char*.char*改为使它,所以你可以实际修改它(使用strcpy):

char* filename;
Run Code Online (Sandbox Code Playgroud)

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