无法将ifstream对象声明为我的类中的成员

时间:2014-03-19 15:04:46

标签: c++

我正在尝试从我的类函数中的多个位置读取文件。因此我认为在头文件中声明对象是非常聪明的(在私有中),但在我这样做后它不再起作用

我确实使用了搜索功能,发现一些关于复制构造函数的问题可能是问题,但我不知道他们做了什么以及为什么我需要改变它们的一些东西(如果在我的代码中就是这种情况) )

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函数)它的工作没有问题,但它不应该与私有的声明一起工作吗?

2 个答案:

答案 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;