![](/img/trans.png)
[英]C++ initialize list assignment in copy constructor and crashing in copy constructor
[英]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::move
在data
上的想法,因为它需要在调用者的上下文中保持有效的对象。
注意 :我已经声明该成员为引用(即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.