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)
看起来你定义filename为一个const char*.char*改为使它,所以你可以实际修改它(使用strcpy):
char* filename;
Run Code Online (Sandbox Code Playgroud)
或者更好,因为这是C++,为什么不利用std::string?
| 归档时间: |
|
| 查看次数: |
10009 次 |
| 最近记录: |