【问题标题】:Class within class - incomplete type is not allowed类中的类 - 不允许不完整的类型
【发布时间】:2013-03-27 22:55:41
【问题描述】:
class Publicatie{
public:
    class Carte : public Publicatie{
    private:
        char* autor;
    };
    class Revista : public Publicatie{
    private:
        char* frecventa_aparitie;
        int numar;
    };
private:
    int cota;
    char* titlu;
    char* editura;
    int anul_aparitiei;
    int tiraj;
    Carte* c;
    Revista* r;
        public:
           //some methods...
}

这是代码,我在 Publicatie 类中声明 Carte 和 Revista 类,我需要拥有私有成员 Carte 和 Publicatie。我真的不知道如何使用这些类进行继承设计。我在继承的标题中收到错误:public Publicatie,我认为它会起作用,因为已经创建了类(即使它的私有成员尚未创建)。

【问题讨论】:

    标签: c++ oop


    【解决方案1】:

    你的设计是错误的。您正在尝试定义一个类,并且在它的定义中您试图从其自身使用;这是一个逻辑悖论。
    根据我从您的代码中可以理解的内容,您正在尝试创建一个名为 Publicatie 的类,它代表一个出版物(或一篇文章),它还有两个其他变体,名为 CarteRevista。如果是这种情况,为什么Publicatie 需要有两个类型为CarteRevista 的私有成员?也许您可以从中删除这两个成员。
    或者您可以将它们的一些共享成员(例如titlutiraj 和...)移动到另一个抽象类,然后定义PublicatieCarteRevista,这样所有它们继承自同一个父类。
    希望这些工作。

    【讨论】:

    • 确实,这是正确的,谢谢 :) 我知道这是一个糟糕的设计,我只是想不出正确的设计。
    • 特别是 Publication (publicatie) 类应该有 2 个说明符 Book (carte) 如果出版物是一本书,或者 Magazine (Revista) 如果它是一本杂志。我认为这是设计原理的正确方法。你能推荐一个更好的吗?
    • 我认为最好的方法是在Publicatie 中不包括CarteRevista。相反,从Publicatie 继承它们,并向它们添加所需的成员或方法(如numar)。然后在您的代码中任何一个函数将Publicatie 作为参数的地方,使用dynamic_cast 检查它是Cartie 还是Revista,或者它们都不是。要了解如何执行此操作,请查看 this answer。此外,此解决方案仅在您具有虚拟功能时才有效。
    【解决方案2】:

    您只能从完整类型的类继承。但是,您不需要在环境类定义中包含嵌套类定义。相反,您可以这样做:

    struct Foo
    {
        struct Bar;
    
        Bar * p;
    
        int get();
    };
    
    struct Foo::Bar : Foo
    {
        int zip() { return 4; }
    };
    
    int Foo::get() { return p->zip(); }
    

    【讨论】:

    • 这是否具有有效的语义含义?从外部类继承的内部类听起来像是组合和继承的糟糕组合。
    • @icepack:它的意思是……它有点递归,是的,就像一个继承的“链表”。我没说这是个好主意:-)
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2021-12-31
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多