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

C++ 从另一个类访问类的私有成员,c++,cocos2d-x,class-design,C++,Cocos2d X,Class Design,我有三节课 class A { B *b; } class B { C *c } class C { .... } 从类A访问类B中的类C实例的最佳方式是什么?还请建议一种为这些类编写构造函数的方法?您有多种可能访问其他类的成员 如果成员是私有的(如您的情况),您可以将其他类声明为该类的朋友,或者编写getter和setter 方法1:getter和setter class A { private: int a; public: int GetA() { return a

我有三节课

class A {
    B *b;
}

class B {
C *c
}

class C {
....
}

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

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

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

方法1:getter和setter

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

class A {
private: 
  int a;
public: 
  friend class B;
};
class A {
public:
  int a;
};
但是,这将允许从代码中的每个其他位置访问您的私有数据。尽管您可以将
setA
离开,但只能对私有
a
进行读取访问


编辑:

正如@tobi303正确指出的那样:通过getter返回原始指针(在您的情况下就是这样)可能不是一个好主意。因此,在这种情况下,我建议要么返回指针指向的对象,要么使用类似的智能指针并返回它们:

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
};
在这种情况下,只有
B
A
可以访问
A
的私有数据。您还可以仅向少数函数授予对私有数据的访问权限

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

方法3:公众成员

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

class A {
private: 
  int a;
public: 
  friend class B;
};
class A {
public:
  int a;
};
与方法1类似(使用getter和setter),您现在授予
A
s成员
A
的读写权限


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

重新思考你想要什么。你希望他们是私人的,还是希望其他课程直接接触他们?这两者是矛盾的。如果您希望这些成员是公共的,只需按相反的顺序编写类。如果成员是私有的,则不应访问它们。将其公开或创建公开访问器。根据您提供的信息,最简单的解决方案是将成员
公开
。对于任何你需要考虑的东西,<>代码> a <代码> >代码> b>代码>和<代码> c>代码>真的是,它们是如何相关的,以及为什么<代码> c>代码>在第一个位置被声明为“代码>私有\代码”。最简单的方法也许最快的方式是使用“朋友”关键字。或者给你一个指向私有成员的指针的函数,或者类似的函数。但是如果你必须这样做,你需要重新思考你的课堂设计。这不是一个好主意——如果是的话,就不需要私人会员了!换句话说,你可以这样做,但你不应该想:-)我认为你的例子并不完美。通过getter返回一个
int
几乎从来都不是问题,但是返回一个原始指针(实际上应该是私有的)是相当困难的questionable@tobi303是的,我还没有意识到OP在他的例子中使用了指针。我为方法1提供了一个使用指针的例子。@Shyam问一个新问题,而不是编辑你的问题并使其完全不同。