5
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;
};

问题> 我在遗留项目中看到了很多与上述类似的代码。我真的不明白这样做的意义。为什么不简单地提供以下内容:

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 。如果是这样,是否所有此类功能都应提供两个版本?对我来说,我觉得很乏味!

4

2 回答 2

9

您是对的: 的目的boost::shared_ptr<const T> getT() const是确保const对象不会意外修改 T 。

在 C++ 中,这被称为const 正确性,通常被认为是好的 C++ 设计。正如您所说,它通常会导致 getter 有两个版本(一个版本const和一个非const版本)。它最初可能很乏味(尽管一旦习惯了它就不错了),但结果可能非常有用。const 正确性使您可以声明函数,例如

void DoSomething(const AccessT& item);

该承诺不会修改,因此如果执行任何声明为可能正在修改的操作item,编译器就会抛出错误。DoSomethingitem

尽管 const 正确性通常被认为是良好的 C++ 设计,但一些开发人员认为必须声明某些函数的 const 和非 const 版本的开销比它的价值更麻烦。

如果您对更多信息感兴趣,C++ FAQ 有一整节关于 const 正确性。

于 2013-02-14T17:44:09.137 回答
1

当感觉需要访问器类时,这种模式很常见,但作者不想走完整的方式来定义访问AccessTAccessTconst常量访问。您看到的 hack 是通过常量和非常量访问器实现常量和非常量访问的不那么繁琐的方法。

这种模式的优点是易于实现,缺点是您将“const 指针”和“指向 const 的指针”的概念混合在一起。如果一个 AccessT 提供了一个setT成员,那么关于 const-ness 的混淆就会随之而来。

您可以将此访问模式与const_例如迭代器显示的模式进行对比,迭代器出现const_iteratoriterator允许可变迭代器和可变迭代器的所有四种组合。

于 2013-02-14T17:44:42.730 回答