C++ strcpy()导致从‘;常量字符*’;至‘;字符*’;[-fpermissive]

C++ strcpy()导致从‘;常量字符*’;至‘;字符*’;[-fpermissive],c++,constructor,constants,destructor,strcpy,C++,Constructor,Constants,Destructor,Strcpy,我试图让一个名为PReader(函数名为Execute(),不带参数)的对象通过构造函数传入一个文件名,以便Execute()可以访问它。我试图设置它的方式包括让构造函数为字符串分配内存,然后复制它,并为它设置析构函数。我知道这很尴尬,但我知道这种设置将使我的项目的未来添加更容易 以下是我的对象当前的设置方式: #include <PReader.h> #include <stdlib.h> #include <stdio.h> #include <st

我试图让一个名为
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.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

在标题中,您有

const char* filename;
您正试图
strcpy
。这是不允许的。换成

char* filename;

看起来您将
filename
定义为
const char*
。将其改为
char*
,这样您就可以实际修改它(使用
strcpy
):


还是更好,因为这是C++,为什么不使用?

< P>这两个声明

之间有区别。
const char * filename;

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

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

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

char * filename;
在这种情况下,您可以更改指针本身和指针指向的对象

所以在类中,ypu应该将文件名定义为

char * const  filename;
或作为

考虑到指针可以定义为

const char * const  filename = "String Literal";
也就是说,该语句定义了指向常量对象的常量指针。您既不能更改指针本身,也不能更改指针指向的对象

等价的声明是

const char * constexpr  filename = "String Literal";

请在您的问题中包括
PReader.h
中的
PReader
的类定义,以及
filename
。添加了
PReader.h
filename
是一个
const char*
。帮这个世界(和你)一个忙,使用std::stringThank,这就解决了它。我猜,只是出于旧的(坏的)C习惯而使用了字符数组。
char * const  filename;
char * filename;
const char * const  filename = "String Literal";
const char * constexpr  filename = "String Literal";