我已经实现了一个缓存类,该缓存类能够以线程安全的方式填充/提取记录(示例中未显示)。 但是我对此类的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;
这是实现所需功能的正确方法吗?
答案 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
当客户端代码在引用上运行时,效率更高。