2009-09-15 11 views
18

Jestem ciekawy scenariusz skonfigurować jak w poniższym przykładzie:Krzyż adresowe zawarte nagłówki w C++ programu

Oto kod, który zostanie umieszczony w pliku o nazwie Header1.h:

#ifndef HEADER1_H 
#define HEADER1_H 

#include "Header2.h" 

class Class1 
{ 
Class2 class2Instance; 
}; 

#endif 

Tutaj jest to kod, który zostanie umieszczony w pliku o nazwie Header2.h:

#ifndef HEADER2_H 
#define HEADER2_H 

#include "Header1.h" 

class Class2 
{ 
Class1 class1Instance; 
}; 

#endif 

otrzymuję komunikaty o błędach, kiedy to zrobić (z powodu obejmuje zakładam), ale wydaje się, jakby to muszę zrobić to w porządku do uwzględnij każdy z obiektów w oddzielnych klasach. Czy ktoś może mi pomóc osiągnąć to, co robię źle?

Odpowiedz

28

Problem polega na tym, że rozmiar klasy 1 zależy od klasy 2 i odwrotnie. Dlatego nie ma sposobu, aby obliczyć rozmiar dla jednego. Naprzód zadeklarować jedną z klas, i zmienić jeden z atrybutów, które mają być wskaźnik lub referencję:

#ifndef HEADER2_H 
#define HEADER2_H 

class Class1; 
class Class2 
{ 
Class1 *class1Instance; 
// or 
Class1 &class1Instance; 
}; 

#endif 
+0

Jest to świetna odpowiedź, ale to tylko rozwiązuje połowę mojego problemu. Nadal umieszczam te dwie klasy w dwóch osobnych nagłówkach. Otrzymuję błąd tylko dla instrukcji include podczas ich wpisywania, bez włączania klasy okrągłej. Czy wiesz, jak ominąć ten problem, nie umieszczając go w tym samym nagłówku. – banDedo

+0

Jaki błąd otrzymujesz? Wpisany przez Ciebie kod nie ma żadnych problemów z dyrektywami włączającymi. –

+0

Wtedy może powinieneś dać nam poprawiony przykład odzwierciedlający twój obecny kod, a także powiedzieć nam dokładnie, jakie błędy otrzymujesz. – TheUndeadFish

1

Co masz to klasyczny okrągły odniesienia. Jest tutaj already been discussed tutaj w przepełnieniu stosu. Po prostu zastosuj zaakceptowaną odpowiedź w tym wątku, zastępując "struct" dla "klasy" i jesteś złoty.

Edited dla jasności

+0

Wierzę, że zaakceptowana odpowiedź właśnie to robi. Zmień słowo "struct" w zaakceptowanej odpowiedzi na słowo "klasa", a wzór jest taki sam. Proszę odzyskać swoje nieuzasadnione noty, kthxbai – Randolpho

+0

. To zrobione. – Randolpho

2

Nie można mieć Class2 zawierać instancję Class1 i mają Klasa1 zawierać instancję Class2. Możesz zrobić, aby każda klasa zawierała referencję lub wskaźnik do instancji innego typu klasy (z odpowiednimi odniesieniami do przodu). tj


class Class2; 
class Class1 
{ 
    Class2& class2Instance; 
}; 

class Class1; 

class Class2 
{ 
    Class1& class1Instance; 
}; 
3

dwóch struktur nieskończenie recurse na siebie - wiedzieć Class1 „s rozmiar trzeba znać rozmiar Class2 która wymaga rozmiaru Class1, etc. Rozwiązaniem tego problemu jest użycie wskaźnika w co najmniej jednym z przypadków:

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 
7

Plik: header1.h

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 

file: header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors 

adaptacją here