如何在用户定义的类中使用`ifstream`对象?

时间:2014-09-25 14:05:44

标签: c++

我是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)但是失败了!enter image description here,有人能给我一个提示吗?非常感谢!

2 个答案:

答案 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::istreamnot std::ifstream。这允许您根据需要使用其他流类型(例如,您可以使用std :: istringstream实例测试代码)。

如果你仍然需要实现一个读取函数,你仍然应该保持运算符的实现,并实现这样的读取:

void Vector::read(std::istream& in)
{
    in >> *this;
}