c++如何优雅地处理不被继承的友谊

C++ how to elegantly deal with friendship not being inherited

本文关键字:继承 友谊 处理 何优雅 c++      更新时间:2023-10-16

我有一组类

class myClassA{
    friend class MyFatherClass;
};

class MyFatherClass{
    ...
};

class MySonClass : public MyFatherClass {
};

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

我只能看到两个选项:

    在任何时候我去添加在myClassA的新类作为一个朋友。(我不喜欢它)我在父函数中创建了一些受保护的包装器来访问myClassA类的方法。(稍微好一点,但我仍然不喜欢它,因为我必须在任何时候在myClassA中创建一个新的方法来创建一个新的包装器)
你有什么更好的办法来解决这个问题吗?

谢谢

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

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

选项1)更具可读性。当有人看到这个课程时,他们会直接知道谁可以访问它。代码应该是表达性的,这个选项完美地描述了意图。

选项2)有点过头了。你正在编写一个包装器,这样你就可以访问一些函数…为什么不从public开始,因为包装器具有公共访问权限。这只是一个额外的抽象层,没有任何意义。

您应该首先考虑功能(工作),表达性和可读性(选项1在这里肯定更好)。

在对应用程序知之甚少的情况下做出判断有点困难,但是如果这些函数只能由MyFatherClass及其后代使用,那么它们应该是MyFatherClassprotected成员(可能是static)。

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

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