[英]How to make const apply to C++ class members that are shared pointers
我在努力弄清楚如何使用共享指针将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_ptr
所有这些东西只是一个红色的鲱鱼。
您有一个指向const
对象的指针,该对象具有一个指向非const
对象的指针。
您当然可以修改后一个对象。
我认为您误解了const
如何与指针一起工作。
const T *
没有声明const
指针,它声明一个指针const
。 也就是说,指针是可变的,但它指向的对象却不是。
将const
添加到指针时,实际上会得到T * const
,它是指向可变对象的const
指针,即,您仍然可以通过指针更改指针。
在std::shared_ptr
(或boost::shared_ptr
)的情况下,添加const
会使您留下const std::shared_ptr<T>
,即您不能更改shared_ptr
,但是可以更改pointee,因为shared_ptr
不会指向一个不变的对象。
为了解决这个问题,您想使用std::shared_ptr<const T>
,它是const
对象的可变shared_ptr
。
您可以通过以下方法解决此问题:
boost::shared_ptr
的指针指向const
,或者,如果在某些情况下,可以改变pointe的指针 const
,另一个重载为可变的)正确返回boost::shared_ptr<const T>
,或者,如果调用者实际上并不需要boost::shared_ptr
本身 const
,另一个重载为可变)返回对T
引用,其中const
重载返回const T &
,而可变重载返回T &
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.