我有3个班级
class A {
B *b;
}
class B {
C *c
}
class C {
....
}
从A类访问B类中C类实例的最佳方法是什么?还请建议一种为每个类编写构造函数的方法吗?
答案 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;
};
在这种情况下,只有B
和A
可以访问A
的私人数据。您还可以将私有数据的访问权限仅授予少数几个功能。
但是,授予私人成员写入权限通常表明您的设计存在缺陷。也许他们应该是公开的(参见方法3),或者你甚至不需要写访问权限,只需阅读它们就足以满足您的需求。
方法3:公开会员
class A {
public:
int a;
};
与方法1(同时具有getter和setter)类似,您现在授予A
成员a
的读写权限。
如果您确实需要对私有成员进行读写访问,那么方法2就是您的选择。但正如我所说:再次考虑你的设计,你真的需要这个吗?