C++如何优雅地处理不被继承的友谊
Posted
技术标签:
【中文标题】C++如何优雅地处理不被继承的友谊【英文标题】:C++ how to elegantly deal with friendship not being inherited 【发布时间】:2011-11-28 10:40:00 【问题描述】:我有一组课程
class myClassA
friend class MyFatherClass;
;
class MyFatherClass
...
;
class MySonClass : public MyFatherClass
;
我的父类可以访问 MyClassA 类的所有方法。 我也希望所有扩展 MyFatherClass 的类都能够调用这样的方法。
我只能看到 2 个选项:
-
我可以随时将新班级添加到 myClassA 中作为朋友。 (不喜欢)
我在父函数中创建了一些受保护的包装器来访问类 myClassA 中的方法。 (稍微好一点,但我仍然不喜欢它,因为我必须随时在 myClassA 中创建新方法时创建一个新包装器)
你有什么更优雅的解决方案的想法吗?
谢谢
【问题讨论】:
通过扩展,您只能访问 public & protected 成员,而 friend 可以访问所有内容。 已更正,您在继承中有错字:)myClassA
中有多少个派生类,多少个成员函数?太多的东西都是代码味道,但也许你有你的理由......
目前儿子班不多...只有 3 个,但以后可能会增加。
使用10-15左右友情调用的方法
【参考方案1】:
首先...优雅是什么意思?更少的代码让你写?我建议您在可读性方面不要妥协。
使用友谊不应该是一个轻率的决定。有很多关于 SO 处理这个问题的线程,但在这里我假设你已经知道这意味着什么。
选项 1) 更具可读性。当有人看到该类时,他们将直接知道谁可以访问它。代码应该是富有表现力的,并且这个选项完美地描述了意图。
选项 2) 有点矫枉过正。您正在编写一个包装器,以便您可以访问某些功能......为什么不让它们开始public
,因为包装器具有公共访问权限。它只是一个额外的抽象层。
您应该首先考虑功能(两者都有效)、表现力和可读性(选项 1 在这里肯定更好)。
【讨论】:
好吧...在选项 2 中,我本来希望将包装器声明为受保护的。至少只有继承才有可能调用这些方法。 bublic 可能有点太危险了。无论如何感谢您的意见.. :)【参考方案2】:对应用程序知之甚少很难做出判断,但如果函数应该仅由MyFatherClass
及其后代使用,它们应该是protected
成员(也许static
) 的 MyFatherClass
。
也许MyClassA
应该是MyFatherClass
的成员,没有自己的成员函数,只是一个struct
来保存一些数据成员。
class MyFatherClass
protected:
struct myStructA
int state;
;
static void DoSomething( myStructA &a );
…
;
只是一个建议……鉴于如此少的信息,很难说出什么是最好的。一般的想法是该语言不允许friend
ship 继承,因为没有它你总是可以做出好的设计。
【讨论】:
以上是关于C++如何优雅地处理不被继承的友谊的主要内容,如果未能解决你的问题,请参考以下文章