使用带有智能指针的getter

时间:2015-11-13 13:29:50

标签: c++ pointers smart-pointers

假设我有以下课程:

$aws/things/<gateway_id>/shadow/get/accepted

现在我可以调用thing shadow来获取指向成员变量?- sat((P+Q) * ~P). P = 0, Q = 1. % succeeds deterministically 的智能指针。但是,问题是我可以使用这个智能指针实际更改成员变量#include "ClassB.h" #include <memory> class A { private: std::shared_ptr<ClassB> aClassB; public: ClassA(); virtual ~ClassA(); std::shared_ptr<ClassB> getClassB() const{ return ClassB; } }; ,这是我不想要的。所以基本上我想实现这样的东西:

ClassA.getClassB()

但是,这不起作用,因为aClassB不是aClassB。我不想在std::shared_ptr<const ClassB> getClassB() const{ return ClassB; 中使aClassB成为常量,因为const的成员函数应该能够更新此aClassB成员变量。

有关如何使用其他类中的get函数获取aClassB的任何建议,但不允许对其他类中的classA进行更改。

3 个答案:

答案 0 :(得分:1)

您可以返回std::shared_ptr<const ClassB>

//#include "ClassB.h"
struct ClassB
{
    int i = 0;
};

#include <memory>
#include <iostream>

class ClassA
{

private:
    std::shared_ptr<ClassB> aClassB;

public:
    ClassA() :aClassB(new ClassB) { aClassB->i = 1; }
    virtual ~ClassA(){}

    std::shared_ptr<const ClassB> getClassB() const {
        return aClassB;
    }
};

int main()
{
    ClassA a;
    //a.getClassB()->i = 2; //error: you cannot assign to a variable that is const
    std::cout << a.getClassB()->i << std::endl; //Works    
}

如您所见,aClassB中的ClassA不是常量。

答案 1 :(得分:0)

我会尝试返回一个`const ClassB&amp;:

const ClassB& getClassB() const {
    return *aClassB;
}

答案 2 :(得分:0)

在不共享时,您确定要在界面中使用共享指针吗?

如果您只想阅读ClassB的值,您可以

const ClassB& getClassB() const {
   return *aClassB;
}