带有Boost shared_ptr的const正确性

时间:2018-07-02 11:50:48

标签: c++ boost

我已经实现了一个缓存类,该缓存类能够以线程安全的方式填充/提取记录(示例中未显示)。 但是我对此类的const正确性有一些怀疑。

给出以下类别:

public:

void add(const Record& record)
{
    boost::shared_ptr<Record> rec(new Record(record));
    _records.push(rec);
}

std::vector<boost::shared_ptr<Record> getRecords() const
{
    return _records;
}

private:

std::vector<boost::shared_ptr<Record> > _records;

在这里,getRecords()函数返回缓存的内容。但是其他每个获取记录的类都可以修改记录,不是吗!!

所以我想将缓存作为const记录的容器返回。

我的新实现如下:

public:

void add(const Record& record)
{
    boost::shared_ptr<const Record> rec(new Record(record));
    _records.push(rec);
}

std::vector<boost::shared_ptr<const Record> getRecords() const
{
    return _records;
}

private:

std::vector<boost::shared_ptr<const Record> > _records;

这是实现所需功能的正确方法吗?

1 个答案:

答案 0 :(得分:1)

原则上,您是对的,将成员声明为std::vector<boost::shared_ptr<const Record> > _records;确实可以防止客户端代码修改存储在您的类中的pointe对象。还有另一个细节值得指出:

std::vector<boost::shared_ptr<const Record> getRecords() const

此方法按值返回向量。因此,客户端代码将始终在Record元素向量的副本上进行操作,这需要复制容器中的每个元素-如果不是必需的,则可以考虑更改方法签名以使其返回引用:

std::vector<boost::shared_ptr<const Record>& getRecords() const

当客户端代码在引用上运行时,效率更高。