Domanda

Sto cercando di dichiarare e utilizzare una classe B all'interno di una classe A e definire B all'esterno di A.
So per certo che questo è possibile perché Bjarne Stroustrup
usa questo nel suo libro "Il linguaggio di programmazione C ++"
(pagina 293, ad esempio le classi String e Srep).

Quindi questo è il mio codice minimo che causa problemi

class A{
struct B; // forward declaration
B* c;
A() { c->i; }
};

struct A::B { 
/* 
 * we define struct B like this becuase it
 * was first declared in the namespace A
 */
int i;
};

int main() {
}

Questo codice fornisce i seguenti errori di compilazione in g ++:

tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’

Ho provato a guardare la C ++ Faq e l'armadio che ho ricevuto era qui e qui ma
quelli non si applicano alla mia situazione.
Ho anche leggere questo da qui ma non risolve il mio problema.

Sia gcc che MSVC 2005 danno errori del compilatore su questo

È stato utile?

Soluzione

Definisci il costruttore per A DOPO la definizione di struct B.

Altri suggerimenti

L'espressione c- > i dereferenzia il puntatore a struct A :: B , quindi una definizione completa deve essere visibile a questo punto del programma.

La soluzione più semplice è rendere il costruttore di A non in linea e fornire un corpo per esso dopo la definizione di struct A :: B .

Questo è un buon esempio del motivo per cui si desidera mantenere le definizioni separate dalle dichiarazioni. Devi cambiare l'ordine delle cose in modo che il costruttore A :: A () sia definito dopo la definizione di struct A :: B .

class A
{
    struct B;
    B* c;
    A();
};

struct A::B
{
    int i;
};

A::A() { c->i; }

int main()
{
    return 0;
}

È interessante notare che ho riscontrato lo stesso problema con la pagina 293 ('11 .12 A String Class ') menzionata nel libro di Stroustrup.

L'esempio fornito nel libro stampato sembra essere in errore, fornendo i seguenti metodi come in linea, invece di definirli dopo la definizione di struct Srep

class String {
  // ...
  void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
  char read(int i) const { return rep->s[i]; }
  void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
  ...etc...

Ho cercato su Google un po 'e ho trovato l'ultima implementazione dell'autore di questa classe di stringhe, disponibile qui:    http://www2.research.att.com/~bs/string_example.c

Sembra che l'abbia modificato in modo che questi metodi non siano più in linea, per evitare il problema menzionato in questo thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top