我有一个对象,在初始化时传递一个大型数据结构:
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; }
。
答案 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
}