2013-03-27 90 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