繁体   English   中英

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

[英]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

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

  1. 使boost::shared_ptr的指针指向const ,或者,如果在某些情况下,可以改变pointe的指针
  2. 在适当的情况下,使用getter的重载(一个重载为const ,另一个重载为可变的)正确返回boost::shared_ptr<const T> ,或者,如果调用者实际上并不需要boost::shared_ptr本身
  3. 使用getter的重载(一个重载为const ,另一个重载为可变)返回对T引用,其中const重载返回const T & ,而可变重载返回T &

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM