2013-03-27 61 views
0
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... 
} 

这是代码,我宣布班内的类别Carte和Revista publicatie,我需要有私人会员点菜和Publicatie。我真的不知道如何用这些类继承设计。我在继承的标题中出现错误:public Publicatie,我认为它会起作用,因为该类已经创建(尽管它的私有成员尚未创建)。类内类 - 不完整类型是不允许的

回答

1

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

+0

确实,这是正确的,谢谢:)我知道这是一个糟糕的设计,我只是无法弄清楚正确的。 – Edeph 2013-03-28 11:36:36

+0

具体来说,如果出版物是杂志(杂志),那么出版物是书籍或杂志(杂志),那么出版物(公开)类应该有2个说明书内的书(carte)。我认为这是设计原则的正确方法。你能建议一个更好的吗? – Edeph 2013-03-28 12:30:27

+0

我认为最好的方法是在'Publicatie'中不包括'Carte'和'Revista'。而是从'Publicatie'继承它们,并将所需的成员或方法(如'numar')添加到它们。那么在你的代码中的任何地方,函数都需要'Publicatie'作为参数,使用'dynamic_cast'来检查它是否是'Cartie'或'Revista'或者它们都不是。看看如何做到这一点,看看[这个答案](http://stackoverflow.com/a/4704988/663036)。此外,此解决方案仅适用于具有虚拟功能的情况。 – sazary 2013-03-28 22:03:28

0

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

struct Foo 
{ 
    struct Bar; 

    Bar * p; 

    int get(); 
}; 

struct Foo::Bar : Foo 
{ 
    int zip() { return 4; } 
}; 

int Foo::get() { return p->zip(); } 
+1

这是否具有有效的语义含义?从外部继承的内部类听起来像是组合和继承的混合。 – SomeWittyUsername 2013-03-27 23:04:18

+0

@icepack:它意味着它的意思......它有点递归,是的,就像继承的“链表”。我没有说这是一个好主意:-) – 2013-03-27 23:07:53

相关问题