使用fstream对象创建为类成员

A. *_* D. 1 c++ fstream copy class file

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

class Asd {

  public:
  Asd();

  private:
  std::fstream stream;

};
Run Code Online (Sandbox Code Playgroud)

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

Asd::Asd() {

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

}
Run Code Online (Sandbox Code Playgroud)

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

no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
Run Code Online (Sandbox Code Playgroud)

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

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

  ...

}
Run Code Online (Sandbox Code Playgroud)

但它打印相同的错误,我不知道该怎么办...还有别人说我必须引用该对象,但我不知道如何?我只想要这个工作,但我想不出来:(

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

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>          ]
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 5

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

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

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

    std::ifstream stream;
};

Asd::Asd(char const* file): stream(file) {}
Run Code Online (Sandbox Code Playgroud)

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

Asd::Asd(char const* file) { stream.open(file); }
Run Code Online (Sandbox Code Playgroud)

通过使用std::ifstream它不需要传递std::ios_base::in(或通过间接从std::ios_base类似派生的类获取此值的任何其他变体std::fstream)到构造函数或者open():std::ios_base::in自动添加到传递给std::ifstream构造函数的任何内容或std::ifstream::open().而且,std::ifstream比一个更简单的类std::fstream.它应该更小,可能更快构建.

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