真正的const共享实例

问题描述 投票:0回答:1

我们的代码中有一个数据对象,创建起来相对昂贵,但其他几个类需要它,因此我们更喜欢有一个共享对象。由于我们根据数据对象初始化文件格式,因此该对象必须保持不变。

我用包含

std::shared_ptr
实例的
const
进行了尝试。但似乎这个实例并不是真正的
const
适合所有人。

#include <iostream>
#include <memory>

struct Data
{
    int value = 0;
};

class DataHolder
{
public:
    DataHolder(std::shared_ptr<const Data> data)
        : m_data(std::move(data))
    {        
    }

    void printValue() const
    {
        std::cout << m_data->value << '\n';
    }

protected:
    std::shared_ptr<const Data> m_data;
};

int main()
{
    auto data = std::make_shared<Data>();
    data->value = 5;

    DataHolder dataHolder(data);
    dataHolder.printValue();

    data->value = 10;
    dataHolder.printValue();

    return 0;
}

是否有任何变体可以在运行时创建并传递真正的常量对象?

c++
1个回答
0
投票
auto data = std::make_shared<Data const>();

一旦执行此操作,任何编辑

*data
的尝试都会导致未定义的行为。

如果您需要先制作一个

Data
对象,然后再制作
const
,请执行以下操作:

Data tmp;
tmp.value = 5;
auto data = std::make_shared<const Data>(std::move(tmp)); // move is just for efficiency.

尝试编辑

data
内容的代码行将无法编译。 如果您删除它们,您的程序将“正确”运行。

如果您选择编辑

tmp
,则
dataHolder.printValue();
将不会反映任何更改。

© www.soinside.com 2019 - 2024. All rights reserved.