【问题标题】:Accessing private members of a class from another class从另一个类访问一个类的私有成员
【发布时间】:2017-08-23 10:15:39
【问题描述】:

我有 3 节课

class A {
    B *b;
}

class B {
C *c
}

class C {
....
}

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

【问题讨论】:

  • 在这里重新考虑您想要什么。您希望它们是私有的,还是希望其他类直接接触它们? 2是矛盾的。但是,如果您希望这些成员公开,只需按相反的顺序编写类即可。
  • 如果成员是私有的,您不应该访问它们。将它们公开或创建公共访问器。
  • 鉴于您提供的信息,最简单的解决方案是让会员public。对于其他任何事情,您需要考虑 ABC 到底是什么,它们之间的关系以及为什么首先将 c 声明为 private
  • 最简单也是最快的方法是使用“朋友”关键字。
  • 看,正如其他人提到的那样,这可以通过“朋友”或为您提供指向私有成员的指针的函数来完成,或诸如此类。但是如果你必须这样做,你需要重新考虑你的类设计。这不是一个好主意——如果是这样,就不需要私人成员了!换句话说,你可以这样做,但你不应该这样做:-)

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


【解决方案1】:

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

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

方法 1:Getter 和 Setter

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),您现在授予As 成员a 的读写访问权限。

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

【讨论】:

  • 恕我直言,您的示例并不完全适合。通过 getter 返回 int 几乎从来都不是问题,但是返回原始指针(实际上应该是私有的)是相当有问题的
  • @tobi303 对,还没有意识到 OP 在他的示例中使用了指针。我提供了一个使用方法 1 的指针的示例。
  • @Shyam 提出一个新问题,而不是编辑您的问题并使其完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多