如何使 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<const T>
不起作用吗?
做一个 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<T>
,即您无法更改shared_ptr
,但您可以更改指针,因为shared_ptr
不会指向一个不可变对象。
要纠正这个问题,您想使用std::shared_ptr<const T>
,这是一个可变的shared_ptr
到const
对象。
您可以通过以下方式解决此问题:
-
使您的
boost::shared_ptr
s 指针指向 const
,或者,如果在某些情况下可以接受改变指针对象
使用 getter 的重载(一个重载是 const
,另一个是可变的)在适当的情况下正确返回 boost::shared_ptr<const T>
,或者,如果调用者实际上不需要 boost::shared_ptr
本身
使用 getter 的重载(一个重载是 const
,另一个是可变的)返回对 T
的引用,const
重载返回 const T &
,可变重载返回 T &
【讨论】:
感谢您的提示。如果我想强制执行此行为,似乎需要进行一些重构,用 get/set 函数替换成员。谢谢!我将此标记为正确答案,因为它还包括解决问题的一些方法。以上是关于如何使 const 适用于作为共享指针的 C++ 类成员的主要内容,如果未能解决你的问题,请参考以下文章