使用带有智能指针的getter

Using a getter with a smart pointer

本文关键字:指针 getter 智能      更新时间:2023-10-16

假设我有以下类:

#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成员变量。

关于如何使用其他类中的get函数获得aClassB,但不允许从其他类更改aClassB的任何建议。

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

如果你只想允许读取ClassB的值,你可以做

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

您可以返回一个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中不是常量。

我会尝试返回`const ClassB&:

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