C++ 将ifstream作为参数传递给类构造函数

C++ 将ifstream作为参数传递给类构造函数,c++,ifstream,C++,Ifstream,我试图通过:ifstream infle 在我的主要介绍中,是一个名为FIFO的类的构造函数:fifoinfle 在FIFO FIFO.h的头文件中,我有: FIFO (std::ifstream); std::ifstream infile; 在FIFO.cc中,我有: FIFO::FIFO (std::ifstream & INFILE) { infile = INFILE; } 我一直觉得它们更多,我只是粘贴其中一个: 在/usr/lib/gcc/x86_64

我试图通过:ifstream infle

在我的主要介绍中,是一个名为FIFO的类的构造函数:fifoinfle

在FIFO FIFO.h的头文件中,我有:

FIFO (std::ifstream);
std::ifstream infile;
在FIFO.cc中,我有:

FIFO::FIFO (std::ifstream & INFILE)
{
         infile = INFILE;
}
我一直觉得它们更多,我只是粘贴其中一个:

在/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../include/c++/4.4.7/bits/localefwd.h:43中包含的文件中, 从/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../include/c++/4.4.7/string:45, 来自FIFO.cc:7: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../include/c++/4.4.7/bits/ios_base.h:在成员函数“std::basic_ios>&std::basic_ios>::operator=const std::basic_ios>&”中: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../include/c++/4.4.7/bits/ios_base.h:793:错误:“std::ios_base&std::ios_base::operator=const std::ios_base&”是私有的 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../include/c++/4.4.7/iosfwd:47:错误:在此上下文中

我不确定使用引用传递ifstream是否有效,或者这是我的代码问题


谢谢

在构造函数声明中,您是按值而不是按引用获取std::ifstream。而不是

FIFO (std::ifstream);
应该是

FIFO (std::ifstream&);
而且,您是通过值而不是引用来存储成员变量'infle'

std::ifstream infile;
应该是

std::ifstream& infile;
由于现在存储对ifstream的引用,因此需要在初始值设定项列表中初始化它,而不是在构造函数中分配它

FIFO::FIFO (std::ifstream & INFILE)
    : infile(INFILE)
{
}

这是因为std::ifstream的复制构造函数是私有的,或者在C++11中被删除。通过按值存储成员变量,您试图复制传递给构造函数的std::ifstream对象。

原型声明和实现的签名不匹配。改变

FIFO::FIFO (std::ifstream & INFILE)
    : infile(INFILE)
{
}
FIFO (std::ifstream);


我根据你的建议更改了代码,但错误仍然存在。我还缺什么东西吗?谢谢另外,我通常让我的类和函数接受IStream而不是ifstreams。然后,您仍然可以将fstream版本传递给他们,但是如果您想通过cin进行测试,您可以。无论哪种方式,都需要像Captain Officious所说的那样通过引用传递。@user2297481在没有实际看到代码和错误消息的情况下很难说。最好和常见的做法是避免使用所有大写标识符,如FIFO和INFLE,除非它们是预处理器宏。。。只是帮助避免冲突和包含宏的邪恶,如果你不知道这些问题,请参见Marshall的C++ FAQ Lite。