我有一个 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/

10-11 12:30