我是C ++的新手,我在创建程序时遇到了使用ifstream
的问题。我在main.cpp中定义了一个infstream
对象,如下所示:
void main() {
string filename;
ifstream inStream;
cout << "Enter name of vector/matrix file (test.txt): ";
cin >> filename;
inStream.open(filename.c_str());
if (!inStream) {
cout << "Couldn't open inStream";
exit(1);
}
Vector v1(4);
v1.read(inStream);
}
我的问题是,如何在Vector类中定义read()
函数才能使用inStream
对象?
class Vector{
private:
int length;
double * contents;
public:
void read(ifstream in);
}
我尝试将其定义为
Vector::read(ifstream inStream)
但是失败了!,有人能给我一个提示吗?非常感谢!
答案 0 :(得分:2)
void read(ifstream in);
应该是
void read(ifstream& in);
因为std::ifstream
不可复制。您需要通过引用传递它。
答案 1 :(得分:1)
我尝试将其定义为Vector :: read(ifstream inStream)但是失败了,有人能给我一个提示吗?非常感谢!
您的代码中有一些问题需要解决。
首先,它不起作用的原因是因为你按值传递了对象。代码应该是:
class Vector{
private:
int length;
double * contents;
public:
void read(ifstream& in); // pass by reference
}
其次,这不是从流中读取的好界面。请考虑一下:
class Vector {
int length;
double * contents;
public:
friend std::istream& operator<<(std::istream& in, Vector& v);
};
的差异:
您正在实现一个运算符,而不是向量的运算。这允许您将读取与使用istream特化的通用代码无缝集成(例如,您可以编写:auto v = boost::lexical_cast<Vector>("serialized representation here");
)
接口定义为of std::istream
,not std::ifstream
。这允许您根据需要使用其他流类型(例如,您可以使用std :: istringstream实例测试代码)。
如果你仍然需要实现一个读取函数,你仍然应该保持运算符的实现,并实现这样的读取:
void Vector::read(std::istream& in)
{
in >> *this;
}