我们的代码中有一个数据对象,创建起来相对昂贵,但其他几个类需要它,因此我们更喜欢有一个共享对象。由于我们根据数据对象初始化文件格式,因此该对象必须保持不变。
我用包含
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;
}
是否有任何变体可以在运行时创建并传递真正的常量对象?
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();
将不会反映任何更改。