从另一个 class 访问 class 的私有成员

Accessing private members of a class from another class

我有 3 个 classes

class A {
    B *b;
}

class B {
C *c
}

class C {
....
}

从 class A 访问 class B 中的 class C 实例的最佳方法是什么?还请建议一种为每个 classes?

编写构造函数的方法

您有多种访问其他 classes 成员的可能性。

如果成员是私有成员(如您的情况),您可以将其他 class 声明为该 class 的好友,或者写 getter 和 setters.

方法 1:getter 和 setter

class A {
private: 
  int a;
public:
  int GetA() { return a; }
  void SetA(int newA) { a = newA; }
};

然而,这将授予从您代码中的所有其他位置访问您的私人数据的权限。尽管您可以离开 setA 导致只能读取私有 a.


编辑

正如@tobi303 正确指出的那样:通过 getter 返回原始指针(在您的情况下)可能不是一个好主意。因此,在这种情况下,我建议 return 指针指向的对象或使用像 std::shared_ptr 和 return 这样的智能指针:

class {
private:
  int *a;
  std::shared_ptr<int> b;
public:
  int getA() { return a ? *a : 0; } // only dereference the pointer if it points somewhere
  std::shared_ptr<const int> getB() { return b; } // return as std::shared_ptr<const int> to prevent indirect write access to a
};

方法二:交友类

class B
{};

class A {
private: 
  int a;
public: 
  friend class B;
};

在这种情况下,只有 BA 可以访问 A 的私有数据。您还可以仅向少数函数授予对私有数据的访问权限。

但是,授予私有成员写入权限通常表明您的设计存在缺陷。也许它们应该是 public(参见方法 3),或者您甚至不需要写入权限,只需读取它们就完全可以满足您的需求。

方法三:Public成员

class A {
public:
  int a;
};

类似于方法 1(使用 getter 和 setter),您现在授予 A 的成员 a 读写权限。

如果您确实需要对私有成员进行读写访问,方法 2 是可行的方法。但正如我所说:再想想你的设计,你真的需要这个吗?