2012-07-02 20 views
6

stavo compilare il codice seguente:tipo incompleto chiamato in nome nidificato specificatore

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

Questo può sembrare strano, ma l'idea era di avere una classe A che potrebbe essere prodotta solo da un oggetto di tipo B (chi probabilmente sarebbe un singleton).

Il problema è che ho creato una dipendenza circolare tra questi oggetti. A deve essere definito prima di B e B deve essere definito prima di A. Apparentemente in avanti dichiarare B non è abbastanza buono, B deve essere effettivamente definito prima dello A (e viceversa).

Come aggirare questo?

Modifica: l'errore effettivo è: Tipo incompleto 'B' denominato nello specificatore del nome nidificato.

Nota: c'è un altro post che è simile a questo qui: Error: incomplete type used in nested name specifier, ma è fortemente templato e questo mi ha confuso, quindi questo post.

+1

È un po 'strano rendere un singolo metodo un amico. Sei sicuro di non voler rendere l'intera classe un amico? –

+0

Non sapevo che fosse possibile. Com'è fatto? devo semplicemente scrivere "friend class B" all'interno di "A" e "friend class A" all'interno di "B"? – anthropomorphic

+1

Proprio così ... –

risposta

5

C++ 2003 afferma che quando si accede ai contenuti della classe, questa classe deve essere completamente definita. La dichiarazione anticipata non è sufficiente. Ciò significa che le dipendenze circolari come la tua non sono semplicemente consentite.

p.s. Dichiarare che tutta la classe come amico dovrebbe funzionare, se questo è tutto ciò di cui hai bisogno.

A proposito, specifica amico genera dichiarazione anticipata per la classe, guarda il seguente codice:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

compilatore darà errore di sintassi per F10 perché C1 non è definito, ma F11 compilerà bene a causa della amico spec. Questo può sembrare strano ma questo è definito nello standard e compilatori seguono questo.

+0

Dichiarare che entrambe le classi come amici dell'altro hanno funzionato per me. Grazie. – anthropomorphic

Problemi correlati