2009-03-24 17 views
5

Przypuśćmy, że chcesz coś tego rodzaju, w jednym pliku .cpp źródło:C++ - 2 klasy 1 plików

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

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

Czy mimo to zrobić bez dzielenia go na dwa oddzielne pliki, a nie wysyłaj błąd kompilatora (błąd składni na doSomething(B *b))

+0

Mnie, oczywiście :-) Albo cokolwiek odpowiedzieć jak najbardziej. –

+0

@ Yuval, zaakceptuj osobę, która jako pierwsza odpowiedziała na twoje pytanie. –

+0

@ Yuval - zaakceptuj pierwszą odpowiedź, która poprawnie i pomocnie odpowiedziała na twoje pytanie. –

Odpowiedz

22

umieścić na pierwszej linii:

class B; 
+0

Byłeś pierwszy, dzięki! :) –

4

przodu zadeklarować jedną klasę przed nawzajem

class B; 
or 
class A; 

Ale nadal nie będzie w stanie realizować

void doSomething(B *b) 

używając tylko do przodu deklarację B. Więc trzeba umieścić definicję doSomething poniżej pełnej klasie deklarację

12

Jeśli dobrze pamiętam dobrze, można „wstępnie zadeklarować” klasa 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) {} 

Następnie klasa „a” wie, że klasa „B” będzie exis ts, chociaż nie zostało jeszcze zdefiniowane.

Deklaracja terminowa jest rzeczywiście poprawnym terminem, jak wspomina Evan Teran w komentarzach.

+1

Dobra odpowiedź, więc otrzymujesz +1.Ale dla odniesienia termin jest "deklaracja" –

3

Tak. Potrzebny jest do przodu deklarację:

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

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

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

Można spróbować przodu deklarację jak

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

ale będzie tylko w stanie zadeklarować wskaźnik i odniesienia dla zmiennych B wtedy. Jeśli chcesz więcej (jak metoda dereferencji zmiennej B *) możesz podać tylko deklarację i zdefiniować metody później w tym samym pliku - w miejscu, gdzie deklaracja obu klas jest już dostępna.

1

Trzeba przodu zadeklarować B.

class B; 

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

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

(A tak przy okazji, nie potrzebują średniki po funkcji członka nawiasy klamrowe. :))

3

The C++ FAQ Lite odpowiedź na to pytanie i inni. Poważnie rozważałbym przeczytanie tej rzeczy do końca, albo zdobycie książki i zrobienie tego samego.

+1

+1 za powiedzenie czegoś innego niż wiązka –

0

Dodaj kolejną deklarację B przed A:

class B; 

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

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
Powiązane problemy