class T
{};
class AccessT
{
public:
boost::shared_ptr<const T> getT() const {return m_T;}
boost::shared_ptr<T> getT() {return m_T;}
private:
boost::shared_ptr<T> m_T;
};
问题&GT;我在遗留项目中看到了许多类似的代码。 我真的不明白这样做的意义。 为什么不简单地提供以下内容:
class T
{};
class AccessTModified
{
public:
boost::shared_ptr<T> getT() const { return m_T; }
private:
boost::shared_ptr<T> m_T;
};
初始参数可能是boost::shared_ptr<const T> getT() const
不会让const对象意外修改T.如果是这种情况,所有这些功能应该提供两种版本吗?对我来说,我觉得很乏味!
答案 0 :(得分:9)
你是对的:boost::shared_ptr<const T> getT() const
的目的是确保const
个对象无法意外修改T.
在C ++中,这被称为 const correctness ,通常被认为是很好的C ++设计。正如您所说,它通常会导致getter有两个版本(const
和非const
版本。它可能最初很乏味(虽然一旦你习惯它也不错),但结果可能非常有用。 Const正确性允许您声明类似
void DoSomething(const AccessT& item);
承诺不修改item
,以便编译器在DoSomething
执行任何声明为可能修改item
的内容时抛出错误。
虽然const正确性通常被认为是很好的C ++设计,但是一些开发人员认为必须声明某些函数的const和非const版本的开销比它的价值更麻烦。
如果您对更多信息感兴趣,C ++常见问题解答中有关于const正确性的a whole section。
答案 1 :(得分:1)
当感觉到需要访问者类时,这种模式很常见,但是作者不想全面定义AccessT
和AccessTconst
以进行访问和持续访问。您看到的黑客是通过常量和非常量访问器实现恒定和非常量访问的不太繁琐的方法。
这种模式的优点是易于实现,缺点是你将“const指针”和“指针指向const”的概念混合在一起。如果AccessT提供setT
成员,则会出现关于const-ness的混淆。
您可以将此访问模式与显示的const_
模式进行对比,例如通过迭代器,它来自const_iterator
和iterator
,并允许所有四种可变迭代器和可变迭代的组合。