我正在尝试从我的类函数中的多个位置读取文件。因此我认为在头文件中声明对象是非常聪明的(在私有中),但在我这样做后它不再起作用
我确实使用了搜索功能,发现一些关于复制构造函数的问题可能是问题,但我不知道他们做了什么以及为什么我需要改变它们的一些东西(如果在我的代码中就是这种情况) )
command.h:
class command
{
public:
command();
~command();
void printCommands() const;
private:
std::ifstream file;
}
Command.cpp
command::command(){
file.open("commands.txt");
}
command::~command()
{
file.close();
}
void command::printCommands() const
{
int i = 0;
std::string line;
std::cout <<"Command list:\n\n";
while (getline(file,line))
{
std::cout << line <<endl<<endl;
}
}
这只是代码的一部分,但基本上我在getline函数中得到错误
我收到此错误
error C2665: 'std::getline' : none of the 2 overloads could convert all the argument types
std::basic_istream<_Elem,_Traits> &std::getline<char,std::char_traits<char>,std::allocator<_Ty>> (std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)
EDIT1:
如果我确实移动了
,我确实忘记了 std::ifstream file;
进入cpp函数(我使用getline函数)它的工作没有问题,但它不应该与私有的声明一起工作吗?
答案 0 :(得分:2)
您的command::printCommands()
被声明为const。由于file
是成员,因此您尝试将const ifstream&
作为非常量std::istream&
参数传递(由std::getline
收到)。
转换在调用时失去了const
限定符(因此编译失败并出现错误)。
要修复此问题,请从command::printCommands()
删除const限定符。
答案 1 :(得分:1)
void command::printCommands() const
该行将printCommands()
声明为const函数。即,一个不改变command
对象的。从输入流中读取是一个更改,因此如果输入流是command
的一部分,那么从中读取必然会更改command
。
我不知道你的程序,所以我不能说出以下是否是一个好主意,但它应该使错误消失:将file
声明为可变成员:
mutable std::ifstream file;