使用带有智能指针的 getter

Using a getter with a smart pointer

假设我有以下 class:

#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 成为 classA 中的常量,因为 ClassA 的成员函数应该能够更新这个 aClassB 成员变量。

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

我会尝试 return `const ClassB&:

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

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

如果您只想允许读取 ClassB 的值,您可以执行

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

你可以return一个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    
}

如您所见,aClassBClassA 中不是常量。