【问题标题】:Difference between nested class and befriending a derived class in base class嵌套类与基类中的派生类之间的区别
【发布时间】:2018-12-08 07:04:52
【问题描述】:

创建所有成员为私有的类 P 和与派生自 P 的类 B 交朋友有什么区别

class P
{
private:
        int i;
        friend class B;
};

class B: public P
{
public:
        void get()
        {
                cout <<i;
        }
};

int main()
{

        B obj2;
        obj2.get();
        return 0;
}

在一个类中创建一个类,这样任何人都不能使用隐藏的类(子类),这样维护起来很容易,而不必担心破坏别人的依赖代码。

在哪种情况下,我们会从上述(或任何其他如果有的话)中选择哪种设计?

这个问题是Why would one use nested classes in C++?答案的评论部分的延续

【问题讨论】:

  • “类 P [...] 与派生自 P 的类 B 交朋友”听起来像是糟糕的设计。你能举个例子吗?
  • @JHBonarius 为什么不呢?想象一个节点类,其父指针指向派生的 Group 类。
  • 当然。让我补充
  • "创建所有成员为私有的类 P 并与派生自 P 的类 B 交朋友" 那么为什么不改为保护所有成员呢?
  • @Scheff 我认为基类不应该依赖于它的派生类:听起来像是循环依赖的风险。还有其他解决方案。

标签: c++ inheritance friend


【解决方案1】:

不要按照你的建议去做:它的设计很糟糕,并且有可能出现循环依赖。请改用受保护的成员。

class P
{
protected:
    int i = 42;
};

#include <iostream>

class B : public P
{
public:
    void get()
    {
        std::cout << i << std::endl;
    }
};

int main()
{
    B Bobj;
    Bobj.get();

    std::cin.ignore();
    return 0;
}

【讨论】:

  • 但是如果你这样做,某人就有机会从类 P 派生,这会产生依赖关系,因此如果你更改 P,就有可能破坏他的代码。同一点在另一个中讨论线程(问题中的链接)
  • @anurag86 您的示例也可以这样说。我在这里建议的是 C++ 的基本设计模式。看来您的问题是XY problem。您真正想要达到什么目标?
猜你喜欢
  • 2011-01-05
  • 2020-06-01
  • 1970-01-01
  • 2023-03-19
  • 2019-04-14
  • 2016-03-11
  • 2012-10-13
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多