1

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

class Asd {

  public:
  Asd();

  private:
  std::fstream stream;

};

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

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>          ]
4

1 回答 1

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_baselike的类获取 this 值的任何其他变体std::fstream)到构造函数或 to open():std::ios_base::in自动添加到传递给std::ifstream构造函数或 to 的任何内容std::ifstream::open()。此外,std::ifstream是一个比std::fstream. 它应该更小,并且构建起来可能更快。

Asd根据 Mooing Duck 的评论,我添加了一个私有复制构造和一个私有赋值运算符,希望编译器会在您尝试复制构造或复制分配对象时将您指向其中之一。请注意,当将 传递给按值获取参数的函数或返回对象时,会尝试复制Asd对象。您的构造函数中的赋值很可能是编译器抱怨无法复制流的一个地方,但可能还有其他地方进行了复制尝试。

于 2013-08-29T22:52:19.293 回答