如何使 const 适用于作为共享指针的 C++ 类成员

Posted

技术标签:

【中文标题】如何使 const 适用于作为共享指针的 C++ 类成员【英文标题】:How to make const apply to C++ class members that are shared pointers 【发布时间】:2014-08-12 00:54:25 【问题描述】:

我正在努力弄清楚如何使用共享指针将 const 指针传递给类。通常你只需声明一个指向对象const 的指针,并且你不能再更改其中的任何成员,但是如果该类使用共享指针,const 似乎并不适用。

这是一个可编译的问题示例。在processA() 中,不可能向向量添加另一个元素,因为对象应该是const

我做错了什么?

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>

struct C 
    int value;
;

struct B 
    std::vector<C> vectorOfC;
;

struct A 
    boost::shared_ptr<B> b;
;

typedef boost::shared_ptr<A> PtrA;

void processA(boost::shared_ptr<const A> a)

    // This should not be possible because 'a' points to const
    C c2;
    c2.value = 456;
    a->b->vectorOfC.push_back(c2);

    for (std::vector<C>::const_iterator
            i = a->b->vectorOfC.begin(); i != a->b->vectorOfC.end(); i++
    ) 
            std::cout << i->value << std::endl;
    


int main(void)

    C c;
    c.value = 123;

    PtrA a(new A);
    a->b.reset(new B);
    a->b->vectorOfC.push_back(c);

    processA(a);
    return 0;

【问题讨论】:

shared_pointer&lt;const T&gt; 不起作用吗? 做一个 const 意味着你不能改变 b,但除此之外什么也没说。 【参考方案1】:

关于shared_ptr 的所有这些东西只是一个红鲱鱼。

您有一个指向const 对象的指针,该对象有一个指向非const 对象的指针。

你当然可以修改后一个对象。

【讨论】:

你是对的。出于某种原因,我完全忘记了将const 应用于对象会使其中的指针不可变,但它不会改变它们指向的对象的任何内容!谢谢提醒:-)【参考方案2】:

我认为您误解了 const 如何使用指针。

const T * 没有声明const 指针,它声明了一个指向const 的指针。 IE。指针是可变的,但它指向的东西不是。

当您将const 添加到一个指针时,您实际上得到了T * const,这是一个指向可变对象的const 指针,即您仍然可以通过指针更改指针。

std::shared_ptr(或boost::shared_ptr)的情况下,添加const会留下const std::shared_ptr&lt;T&gt;,即您无法更改shared_ptr,但您可以更改指针,因为shared_ptr不会指向一个不可变对象。

要纠正这个问题,您想使用std::shared_ptr&lt;const T&gt;,这是一个可变的shared_ptrconst 对象。

您可以通过以下方式解决此问题:

    使您的 boost::shared_ptrs 指针指向 const,或者,如果在某些情况下可以接受改变指针对象 使用 getter 的重载(一个重载是 const,另一个是可变的)在适当的情况下正确返回 boost::shared_ptr&lt;const T&gt;,或者,如果调用者实际上不需要 boost::shared_ptr 本身 使用 getter 的重载(一个重载是 const,另一个是可变的)返回对 T 的引用,const 重载返回 const T &amp;,可变重载返回 T &amp;

【讨论】:

感谢您的提示。如果我想强制执行此行为,似乎需要进行一些重构,用 get/set 函数替换成员。谢谢!我将此标记为正确答案,因为它还包括解决问题的一些方法。

以上是关于如何使 const 适用于作为共享指针的 C++ 类成员的主要内容,如果未能解决你的问题,请参考以下文章

Linux:作为共享对象 API 的 C++ 抽象类

第5课.引用的本质分析

C++杂谈const限定符与const指针

指向从未被设为 const 的 const 对象的 C++ 指针 [重复]

C++ 中的 volatile 与 mutable

将数组作为 C++ 中方法的 const 参数传递