【发布时间】:2013-07-26 22:07:17
【问题描述】:
我有一个班级需要了解一些大型数据结构。因此,我创建了一个构造函数,它接受对该大型数据结构的引用并使用它来初始化成员变量,如下所示:
class Foo {
public:
BigStruct m_bigstruct;
Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
};
这似乎复制了inBigStruct,但我不想浪费这些资源,因为BigStructs 很大。有没有更标准的方法可以让 Foo 可以使用 inBigStruct 的内容而不复制它?我知道我可以做到:
class Foo {
public:
BigStruct* m_bigstruct;
Foo(BigStruct* inBigStruct) : m_bigstruct(inBigStruct) {}
};
这是使inBigStruct 可用于Foo 而无需复制的常用方法吗?如果不是,那是什么?
【问题讨论】:
-
你也可以持有
Bigstruct的引用。 -
在 c++11 之前,语言中没有内置方法可以知道何时可以安全地从另一个对象中窃取。我想你可以写一个
steal(BigStruct& other)函数。使用 c++11 编写移动构造函数:msdn.microsoft.com/en-us/library/dd293665.aspx -
@BoBTFish:C++03 中通常的习惯用法是实现和使用
swap,而不是一个名为steal的函数。不过,这几乎是相同的事情:调用者会判断是否可以与原件混淆。 -
既然我们提到了 C++11,我应该指出,我通过使用 lambda 轻松解决了 C++11 中真正的问题——函子。捕获时无需复制。
标签: c++ class initialization