2013-08-29 55 views
1

我有一个fstream的对象在我的课像这样(只是一个例子)宣称:使用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>   ] 
+0

文件是一个std :: string,但即使我把一个char const *放入它中,初始化程序也会输出相同的错误。而@Manu343726我应该总是喜欢在构造函数体外构建还是只在这种情况下构建?我觉得它有点尴尬,习惯于把所有的任务放在构造函数里^^但是这并不是很多,因为我是一个初学者 –

+0

我认为你应该更喜欢所有情况下的初始化列表。我当然会这样做,而且我的大部分构造函数最终都是空的。 –

+0

我认为错误信息与问题中的代码无关,除了你有一个'fstream'成员的类。 –

回答

5

根据你写的东西,看来你还是得在分配中的。构造尝试,如果这个工程:

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

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

    std::ifstream stream; 
}; 

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

使用成员初始化列表构造对象避免了默认的构造,然后为以后设置它。如果你真的想先建立流,后来将它设置,您不能使用分配,因为流不是警察y可构建,也不可转让。但是,你可以只打开它,例如:

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

通过使用std::ifstream它不需要通过std::ios_base::in(或通过间接std::ios_basestd::fstream派生类得到一个这个值的任何其他变化)来构造或open()std::ios_base::in会自动添加到传递给std::ifstream的构造函数或std::ifstream::open()的任何内容中。另外,std::ifstreamstd::fstream稍微简单一些。它应该更小,并且可能更快地构建。

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

+0

实际上,当你尝试复制一个有复制构造函数为private和undefined的成员的对象时,这个错误在我看来就像MSVC9给出的那样。 MSVC9不会告诉你在哪里复制。 –

+0

OP的错误信息与这里的不同:http://rise4fun.com/Vcpp/Kd1F但显然这个版本也不会告诉你这个副本在哪里。 (请参阅'main'根本不在输出中) –

+0

感谢您的支持......不幸的是,我确实完成了您所写的内容,但错误仍然存​​在。我将不得不更多地考虑这一点,但我很抱歉,明天我必须这样做,因为我现在没有时间了......我会在这个线程中回复并希望好消息:(编辑:哦,我把完整的错误信息放在我原来的文章 –