我遇到与operator=
相关的编译错误。
error C2248: 'std::basic_ifstream<_Elem,_Traits>::operator =' : cannot access private member declared in class
'std::basic_ifstream<_Elem,_Traits>
以下是代码:
class A1 {
protected:
regex someValue;
public:
A1(){};
A1(const string & value_A ): someValue(value_A){};
};
class B2 : public A1 {
public:
B2(const char * value_B): A1(value_B){filewithResults.open("Output1.txt");};
ofstream filewithResults; // seems this parameter cause complatiion problems
};
int main(){
B2 object1 = B2("something1");
B2 object2 = B2("something2");
//then in program I assign object1 = object2;
}
结果:
所以似乎公开&#34; ofstream filewithResults&#34;引起问题。如何适应它?
还有一个错误:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\fstream(1035) : see declaration of 'std::basic_ofstream<_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 'B2 &B2::operator =(const B2 &)'
答案 0 :(得分:1)
您的class B2
中有一位无法复制的成员。在您决定如何摆脱编译错误之前,这指出了您必须考虑的概念性问题。
class B2
的任何对象都旨在将结果写入具有硬编码名称的文件。如果有两个对象写入该文件,应该是什么行为?
如果他们都应该写入同一个文件,并确保没有数据丢失:
ofstream*
或更好,std::shared_ptr<ofstream>
)而不是流。如果您的应用程序是多线程的,您可能希望围绕其用法添加互斥锁。但是,当您object1
和object2
独立创建并打开相同的文件进行编写时,这仍然无法解决问题 - object2
将失败。std::string
) - 并在适当时打开/关闭流。如果您不关心对象写入您的信息流的内容:
添加赋值运算符,其实现复制除流之外的所有内容。流不会被复制;在其中一个对象中,流将无法打开输出文件,并且将忽略对它的所有写入。
class B2 : public A1 {
B2& operator=(B2 other_object);
};
B2& B2::operator=(B2 other_object)
{
A1::operator=(other_object);
// if B2 had any other members, you'd assign them here:
some_member = other_object.some_member;
}
请注意,您必须同时包含声明和定义:
B2& operator=(B2 other_object); // declaration
B2& B2::operator=(B2 other_object) {...} // definition
(如果定义是内联的,则两者可以合并:class B2 { ... here ... }
)
如果您更愿意写入不同的文件:
将文件名传递给class B2
的每个对象。在构造函数或专用方法中:
B2(const char * value_B, std::string resultFilename):
A1(value_B),
filewithResults(resultFilename)
{
}
在构造函数中生成唯一的文件名,而不是使用Output1.txt
答案 1 :(得分:-2)
如果您不想为同一个对象获取两个引用,那么您应该复制该对象,即。从旧的内容构建新实例。为什么不定义复制构造函数并让它开展业务呢?