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