错误C2248:无法访问类中声明的私有成员,operator =

时间:2015-03-29 11:12:49

标签: c++ assignment-operator

我遇到与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 &)'

2 个答案:

答案 0 :(得分:1)

您的class B2中有一位无法复制的成员。在您决定如何摆脱编译错误之前,这指出了您必须考虑的概念性问题。

class B2的任何对象都旨在将结果写入具有硬编码名称的文件。如果有两个对象写入该文件,应该是什么行为?

如果他们都应该写入同一个文件,并确保没有数据丢失:

  • 您可以按住指针(ofstream*或更好,std::shared_ptr<ofstream>)而不是流。如果您的应用程序是多线程的,您可能希望围绕其用法添加互斥锁。但是,当您object1object2独立创建并打开相同的文件进行编写时,这仍然无法解决问题 - 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)

如果您不想为同一个对象获取两个引用,那么您应该复制该对象,即。从旧的内容构建新实例。为什么不定义复制构造函数并让它开展业务呢?