我有一个 Foo
类,它在其中定义了一个公共(public)结构 Data
,其中一个 QVector<Data> allData
嵌套了 Data
结构的多个对象:
class Foo
{
public:
struct Data {
uchar valueA;
uchar valueB;
uchar valueC;
};
private:
QVector<Data> allData;
};
我还有另外两个类 B 和 C,它们需要每秒多次读取
allData
。他们根本不能写入 allData
,这只能由 Foo
类处理。考虑到性能,我正在寻找一种方法来做到这一点,而无需每次都创建新的 QVector。据我了解,这样的方法:
QVector<Data> getAllData() {
return allData;
}
每次调用此方法时都会创建一个新对象。
如果我给其他类一些类似
QVector<Data> allDataCopy
的东西,它只是被移交给 Foo
以填充 allData
内部的值,这只会导致每次都必须复制所有值,我想这也不会很好。有什么有效的方法可以解决这个问题吗?
最佳答案
除非您想强制用户复制,否则您的“getter”不应按值返回。提供两个重载,分别返回一个左值引用和一个 const
左值引用(如果您不希望 const
的用户改变 Foo
,则只返回 allData
一个):
QVector<Data>& getAllData() {
return allData;
}
const QVector<Data>& getAllData() const {
return allData;
}
这仍将允许您的用户制作拷贝(如果需要),但也使您的用户只需通过引用观察/改变
allData
,而无需任何拷贝。在 C++11 及更高版本中,如果
QVector
支持移动语义,您可能还想重载 &&
ref 限定符:QVector<Data>& getAllData() & { return allData; }
const QVector<Data>& getAllData() const& { return allData; }
QVector<Data> getAllData() && { return std::move(allData); }
这允许用户方便地从
allData
类型的右值中移动 Foo
。关于可以从类中设置的 C++ 只读结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48324726/