c++如何优雅地处理不被继承的友谊
C++ how to elegantly deal with friendship not being inherited
我有一组类
class myClassA{
friend class MyFatherClass;
};
class MyFatherClass{
...
};
class MySonClass : public MyFatherClass {
};
父类可以访问类MyClassA的所有方法。我也希望所有扩展MyFatherClass的类都能够调用这样的方法。
我只能看到两个选项:
- 在任何时候我去添加在myClassA的新类作为一个朋友。(我不喜欢它)我在父函数中创建了一些受保护的包装器来访问myClassA类的方法。(稍微好一点,但我仍然不喜欢它,因为我必须在任何时候在myClassA中创建一个新的方法来创建一个新的包装器)
谢谢
首先…优雅是什么意思?编写的代码更少?我建议你在可读性方面不要妥协。
使用友谊不应该是一个轻率的决定。有很多关于SO处理这个问题的线程,但是在这里我假设你已经知道这意味着什么。选项1)更具可读性。当有人看到这个课程时,他们会直接知道谁可以访问它。代码应该是表达性的,这个选项完美地描述了意图。
选项2)有点过头了。你正在编写一个包装器,这样你就可以访问一些函数…为什么不从public
开始,因为包装器具有公共访问权限。这只是一个额外的抽象层,没有任何意义。
您应该首先考虑功能(工作),表达性和可读性(选项1在这里肯定更好)。
在对应用程序知之甚少的情况下做出判断有点困难,但是如果这些函数只能由MyFatherClass
及其后代使用,那么它们应该是MyFatherClass
的protected
成员(可能是static
)。
也许MyClassA
应该是MyFatherClass
的成员,没有自己的成员函数,只有一个struct
来保存一些数据成员。
class MyFatherClass {
protected:
struct myStructA {
int state;
};
static void DoSomething( myStructA &a );
…
};
这只是一个建议,在信息如此之少的情况下,很难说什么是最好的。一般的想法是,语言不允许friend
船舶继承,因为您总是可以在没有它的情况下做出好的设计。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 继承的友谊
- 友谊被继承??奇怪
- 子班继承友谊
- 友谊和私有嵌套类继承
- 继承和友谊访问.C++
- 友谊和继承有什么区别?
- c++如何优雅地处理不被继承的友谊
- 是否可以将友谊与继承结合起来访问私有数据成员?
- 友谊与继承
- 基于继承关系的模板友谊