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

时间:2017-08-23 10:15:40

标签: c++ cocos2d-x class-design

我有3个班级

class A {
    B *b;
}

class B {
C *c
}

class C {
....
}

从A类访问B类中C类实例的最佳方法是什么?还请建议一种为每个类编写构造函数的方法吗?

1 个答案:

答案 0 :(得分:2)

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

如果某个成员是私有的(如您的情况),您可以将其他类声明为此类的朋友,也可以编写getter和setter。

方法1:获取和设置者

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

然而,这将允许您从代码中的其他位置访问您的私人数据。虽然您可以离开setA,但只能对私人a进行读取访问。

编辑

正如@ tobi303正确指出的那样:通过getter返回一个原始指针(就像你的情况一样)可能不是一个好主意。所以我建议在这种情况下返回指针指向的对象或使用像std::shared_ptr这样的智能指针并返回它们:

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
};

方法2:朋友类

class B
{};

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

在这种情况下,只有BA可以访问A的私人数据。您还可以将私有数据的访问权限仅授予少数几个功能。

但是,授予私人成员写入权限通常表明您的设计存在缺陷。也许他们应该是公开的(参见方法3),或者你甚至不需要写访问权限,只需阅读它们就足以满足您的需求。

方法3:公开会员

class A {
public:
  int a;
};

与方法1(同时具有getter和setter)类似,您现在授予A成员a的读写权限。

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