绕过私有拷贝构造函数/拷贝分配C ++

时间:2014-04-30 21:58:37

标签: c++

我有一个对象,在初始化时传递一个大型数据结构:

class foo {
public: 
   foo(const BigData& data);

   command();

}

BigData的复制构造函数和复制赋值运算符是私有的,这是正确的。

但是,我需要更改class foo,以便command()可以访问BigData。考虑到程序的结构,传递command(const BigData& data)是非常困难的,所以我想做以下事情:

class foo {
public: 
   foo(const BigData& data);

   command();
private:
   BigData m_data;
}

但是如何在没有复制构造函数或复制赋值的情况下初始化m_data?我也不喜欢std::movedata的想法,因为它需要在调用者的上下文中保持有效的对象。

注意:我已将该成员声明为引用(即const BigData& m_data),但这不能在icpc下编译:

error: foo provides no initializer for reference member "m_data"

我使用了foo(const BigData& data) : m_data(data)以及foo(const BigData& data) { m_data = data; }

3 个答案:

答案 0 :(得分:3)

如何存储参考文献?

class foo
{
public: 
   foo(const BigData& data) : m_data(data) {}
   command();
private:
   const BigData & m_data;
};

答案 1 :(得分:3)

如果BigData没有复制构造函数且没有赋值运算符,则作者不希望您复制它。但是,您可以自己const引用它,如下所示:

class foo {
public: 
   foo(const BigData& data) : m_data(data) {}
   command();
private:
   const BigData &m_data;
};

现在,您的command()成员函数可以访问已传递给BigData构造函数的foo

需要记住的一点是,BigData对象的生命周期与foo对象的生命周期无关。您需要确保在foo::command()运行时,传递给BigData的构造函数的foo是相同的。否则,由于悬空引用,您的程序将具有未定义的行为。

另一种方法是让自己的类与BigData类似,并从他们的班级复制到你的班级。但是,就编程工作而言,这可能是令人望而却步的。

答案 2 :(得分:1)

class foo {
public: 
 foo(const BigData& data);

 command();
private:
 const BigData& m_data;
}

// constructor
foo::foo(const BigData& data)
: m_data( data ) 
{
 // usual stuff
}