2012-11-11 18 views
9

Mentre consideravo soluzioni "creative" (cioè bizzarre) a uno strano problema, una particolare idea scatenava la mia curiosità. Non è un'idea che probabilmente userò, ma mi piacerebbe comunque sapere se è legale secondo lo standard.Una classe membro può ereditare dal suo genitore?

Un semplice esempio potrebbe essere ...

class base_t 
{ 
    private: 
    // stuff 

    public: 
    // more stuff 

    class derived_t : public base_t // <--- weirdness here 
    { 
     // ... 
    };  
}; 

Parte della stranezza - dal derived_t eredita da base_t che contiene derived_t, sembra che derived_t stessa contiene.

Quindi - si tratta di una cosa valida ma strana e spaventosa di un tipo simile a curiously recurring template pattern o è illegale?

EDIT - Dovrei forse dire che la ragione per cui ho pensato a questo stava cercando di evitare un inquinamento dello spazio dei nomi. Avere una classe come membro evita di introdurre un'altra classe globale, ma quella seconda classe deve condividere molto dal primo.

Se fosse solo una coppia di classi non sarebbe un problema, ma questo è per un generatore di codice.

+1

Basta pensarci. Pensa a una scatola che contiene se stessa ... –

+2

Da una prospettiva OOP questo è per lo meno inutile ... –

+0

@Bruno: Non necessariamente. –

risposta

9

È legale, ma forse non è il modo in cui hai organizzato il codice. Una classe base deve essere completa nel momento in cui viene utilizzata, ma non prima della parentesi di chiusura della definizione. Quindi prova avanti-dichiarando la classe nidificata:

class base_t 
{ 
    private: 
    // stuff 

    public: 
    // more stuff 

    class derived_t; 
}; 

class base_t::derived_t : public base_t 
{ 
    // ... 
};  
+0

ora sto cominciando a chiedermi sulla completezza del CRTP di classe derivata. c'è qualcosa di sottile qui, penso. –

+0

@Alf: Bene, la classe * è * completa all'interno delle funzioni membro a causa di un'elaborazione a due fasi. Forse questo vale anche per le definizioni dei tipi annidati. Per CRTP, tuttavia, non è necessario che un parametro modello sia completo e un modello basato su una classe incompleta non è necessariamente incompleto. –

Problemi correlati