友谊:来自同一家长的许多课程

friendship: many classes from same parent

本文关键字:许多课 一家 友谊      更新时间:2023-10-16

如何在所有派生类中不friend的情况下达到privateMember

class parent{...};  //a virtual class
class A: public parent{...};
class B: public parent{...};
class C: public parent{...};
class D: public parent{...};
class E: public parent{...};
...
//each has a function, that want access to privateMember
class MyClass{
    int privateMember;
    friend parent;
    //I know it doesnt't work, but this shows the best what I want   
}

保持原样(带friend class parent)并添加一个访问器函数来parentAB ,...将使用。它将受到保护,因此层次结构外部的函数无法使用它。

class parent {
protected:
  static int& getPrivate( MyClass & c ) { return c.privateMember; }
...
};

您必须这样做,因为友谊不会扩展到派生类。

你可以创建一个getter函数,它将返回一个privateMember:

int getPrivateMember() const { return privateMEmber; }

当然,这必须是一种公共方法。

这里的简单答案是不要纠结于其他类的内部状态。相反,请使用他们的公共 API。这样,您就不必担心将自己锁定在实现中,并且可以避免在修改变量时无意中破坏类不变量的各种潜在问题。