C ++如何优雅地处理友谊而不是继承

时间:2011-11-28 10:40:01

标签: c++ inheritance friend

我有一组课程

class myClassA{
    friend class MyFatherClass;
};

class MyFatherClass{
    ...
};

class MySonClass : public MyFatherClass {
};

我的父类可以访问MyClassA类的所有方法。 我还希望所有扩展MyFatherClass的类都可以调用这样的方法。

我只能看到两个选项:

  1. 我随时都会在myClassA中添加新课程作为朋友。 (我不喜欢)
  2. 我在father函数中创建了一些受保护的包装器,以便从类myClassA访问该方法。 (稍微好些但我仍然不喜欢它,因为我必须在myClassA中创建一个新方法时随时创建一个新的包装器)
  3. 你对这个问题有更优雅的解决方案吗?

    由于

2 个答案:

答案 0 :(得分:1)

首先......优雅是什么意思?你写的代码少了吗?我建议你在可读性方面不妥协。

使用友谊不应该是一个轻率的决定。 SO上有很多线程处理这个,但在这里我假设你已经知道这意味着什么。

选项1)更具可读性。当有人看到课程时,他们会直接知道谁有权访问它。代码应具有表现力,此选项完美地描述了意图。

选项2)有点矫枉过正。您正在编写一个包装器,以便您可以访问某些函数...为什么不让它们public开始,因为包装器具有公共访问权限。它只是一个无添加的抽象层。

首先应该考虑功能(兼具功能),表现力和可读性(选项1在这里肯定更好)。

答案 1 :(得分:0)

对于应用程序知之甚少而做出判断有点困难,但如果MyFatherClass及其后代只使用 这些函数,它们应该是{{1} } protected的成员(可能static)。

也许MyFatherClass应该是MyClassA的成员,没有自己的成员函数,只有MyFatherClass来保存一些数据成员。

struct

只是一个建议......如果给出这么少的信息,很难说什么是最好的。一般的想法是语言不允许class MyFatherClass { protected: struct myStructA { int state; }; static void DoSomething( myStructA &a ); … }; 船舶继承,因为如果没有它,你总能做出好的设计。