使用fstream对象创建为类成员

时间:2013-08-29 22:41:45

标签: c++ file class copy fstream

我在我的类中声明了一个像这样的fstream对象(只是一个例子):

class Asd {

  public:
  Asd();

  private:
  std::fstream stream;

};

现在,当调用构造函数时,我想指定像这样的参数

Asd::Asd() {

  this->stream = std::fstream(file, std::fstream::in);

}

然后在我拥有的所有类函数中使用该流,但它不起作用。 VS给我的一个错误是:

no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'

所以我读到了这一点,我所能找到的就是我不能(或者更确切地说:不应该)复制流,事实上我甚至不想这样做。有人说可以将其添加到构造函数中:

Asd::Asd() : stream(file, std::fstream::in) {

  ...

}

但它打印出相同的错误,我不知道该怎么做......还有别人说我必须引用该对象,但我不知道怎么做?我只想让它起作用,但我无法弄明白:(

编辑:这是完整的错误消息

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream(860): error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator =(const std::basic_istream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream(604): error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(177) : see declaration of 'std::basic_ios<_Elem,_Traits>::operator ='
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator =(const std::basic_ostream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]

1 个答案:

答案 0 :(得分:5)

根据您所写的内容,您的构造函数中似乎仍然有一个赋值。试试这是否有效:

class Asd {
public:
    Asd(char const* file);

private:
    Asd(Asd&);
    void operator= (Asd&);

    std::ifstream stream;
};

Asd::Asd(char const* file): stream(file) {}

使用成员初始化列表构造对象避免默认构造它,然后必须稍后进行设置。如果您真的想先构建流并稍后进行设置,则不能使用赋值,因为流既不是可复制的,也不是可复制的。但是,您可以打开它,例如:

Asd::Asd(char const* file) { stream.open(file); }

使用std::ifstream不需要传递std::ios_base::in(或通过间接派生自std::ios_base的类std::fstream获取此值的任何其他变体)构造函数或open()std::ios_base::in会自动添加到传递给std::ifstream的构造函数或std::ifstream::open()的任何内容中。此外,std::ifstreamstd::fstream更简单。它应该更小,并且构建起来可能更快。

基于Mooing Duck的评论,我添加了一个私有拷贝构造和一个私有赋值运算符,希望编译器指向其中一个,以防你尝试复制构造或复制分配Asd宾语。请注意,在通过值传递参数或返回Asd对象时,会尝试复制对象。构造函数中的赋值很可能是编译器抱怨无法复制流但可能有其他地方进行复制尝试的地方。