繁体   English   中英

解决私有副本构造函数/副本分配C ++

[英]Getting around private copy constructor/copy assignment 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; } foo(const BigData& data) { m_data = data; }

如何存储参考?

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

如果BigData没有副本构造函数和赋值运算符,那么作者不希望您为其复制副本。 但是,您可以自己对其进行const引用,如下所示:

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

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

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

另一种选择是使您自己的类类似于BigData ,并从其类中复制一个到您的类中。 但是,就编程工作而言,这可能是令人望而却步的。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM