【发布时间】:2014-05-01 06:09:45
【问题描述】:
我有一个对象,它在初始化时传递了一个大型数据结构:
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?我也不喜欢data 上的std::move 的想法,因为它需要在调用者的上下文中保持有效的对象。
注意:我已将成员声明为引用(即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; }。
【问题讨论】:
-
如果你不想复制,那么你可能需要存储一个引用(或一个指针,如果你想允许重新就位和持有 nullptr 的可能性。)跨度>
-
"如何在没有复制构造函数或复制赋值的情况下初始化 m_data?" - 你不能。正如所写的
BigData不可复制,除非BigData的成员和朋友可以复制,我认为foo不是其中之一(而且听起来你也不想要一份副本)。使用 const-reference 并确保传递的BigData至少与foo实例一样长。 -
"我已经将成员声明为引用..." 它必须是
const引用,因为您正试图从传入的const引用初始化它。 -
这是一个
const参考。 -
你打错了一些东西。显示您的类现在的样子,直接从您实际尝试编译的代码中复制和粘贴。
标签: c++