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";