2009-03-24 6 views
5

Supongamos que quiero algo de este tipo, en un archivo de .cpp fuente:C++ - 2 clases de 1 archivos

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 

¿Hay alguna forma de hacer esto sin dividirla en dos archivos separados, y sin recibir un error de compilación (error de sintaxis en doSomething(B *b))

+0

Me, obviamente :-) O lo que usted respuesta Como la mayoría. –

+0

@Yuval, acepte a la persona que fue la primera en responder su pregunta. –

+0

@Yuval - acepte la primera respuesta que respondió su pregunta de manera correcta y útil. –

Respuesta

22

ponen en la primera línea:

class B; 
+0

Usted fue el primero, ¡gracias! :) –

4

declaran hacia adelante una clase antes de otro con

class B; 
or 
class A; 

Pero aún así usted no será capaz de implementar

void doSomething(B *b) 

utilizando sólo la declaración de avance de B. Así que hay que poner definición de doSomething inferior a la clase completa una declaración

12

Si recuerdo así, se puede 'pre-declarar' la clase B.

class B; // predeclaration of class B 

class A 
{ 
    public: 
     void doSomething(B* b); 
} 

class B 
{ 
    public 
     void doSomething(A* a) {} 
} 

public void A::doSomething(B* b) {} 

Entonces, la clase 'a' sabe que una clase 'B' se exis ts, aunque todavía no se ha definido realmente.

De hecho, la declaración directa es el término correcto, como lo menciona Evan Teran en los comentarios.

+1

buena respuesta, por lo que obtiene el +1.Pero para referencia, el término es "declaración adelante" –

3

Sí. Se necesita una declaración adelantada:

class B; // add this line before A's declaration 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
1

Usted puede intentar una declaración hacia adelante como

class B; 
class A { 
    void Method(B*); 
}; 
class B{ 
}; 

pero sólo se podrá declarar variables de enlace y de referencia para B a continuación. Si quiere más (como un método que desreferencia la variable B *) puede proporcionar una declaración solamente y definir métodos más adelante en el mismo archivo, en el punto en que la declaración de ambas clases ya está disponible.

1

Necesitas reenviar declarar B.

class B; 

class A 
{ 
public:   
    void doSomething(B *b) {} 
}; 

class B 
{  
public:   
    void doSomething(A *a) {} 
}; 

(Y por cierto, no necesitas los puntos y comas después de la función de miembro de llaves. :))

3

The C++ FAQ Lite responde a esta pregunta y otros. Consideraría seriamente leer esa cosa de principio a fin, o conseguir el libro y hacer lo mismo.

+1

+1 por decir algo diferente al grupo –

0

Añadir otra declaración de B antes de A:

class B; 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
Cuestiones relacionadas