inlcudowanie headerów

0

Witam:
Mam taki problem:
plik control.h zawiera definicje klas: Element, Control, Button, Static oraz struktur BlendColor i ElementHolder. Cała treść pliku opatrzona jest dyrektywą:

#ifndef _CONTROL_
#define _CONTROL_
...
#endif

plik control.cpp zawiera implementacje ciał metod powyższych klas/struktur oraz na początku ma headery:

#include "control.h"
#include "dialog.h"

plik dialog.h zawiera na początku pliku prototypy:

class Element;
class Dialog;
class Control;
class Static;
class Button;
struct BlendColor;
struct ElementHolder;

no a potem definicje klas DialogManager i Dialog które zawierają elementy tych klas.
Cała treść pliku opatrzona jest dyrektywą:

#ifndef _DIALOG_
#define _DIALOG_
...
#endif

plik dialog.cpp zawiera na początku:

#include "dialog.h"
#include "control.h"

no i defiinicje ciał metod klas Dialog i DialogManager.

Błąd przy kompilacji:
1>f:\gra\dialog.h(215) : error C2079: 'Dialog::mCapElement' uses undefined class 'Element'
1>main.cpp
1>f:\gra\dialog.h(215) : error C2079: 'Dialog::mCapElement' uses undefined class 'Element'
1>Generating Code...

mCapElement jest klasy Element. Jakby był to wskaźnik do klasy Element to problemu by nie było. Pole klasy Element mają też klasy w pliku control.h Czy wobec tego jedyne wyjście to definicja 3-ego pliku nagłówkowego w której umieszczę klasę Element?

0

Inny drugi problem:

plik control.h zawiera definicje klas: Element, Control, Button, Static oraz struktur BlendColor i ElementHolder. Cała treść pliku opatrzona jest dyrektywą:
#ifndef CONTROL
#define CONTROL
...
#endif

plik control.cpp zawiera implementacje ciał metod powyższych klas/struktur oraz na początku ma headery:
#include "control.h"
#include "dialog.h"

plik dialog.h zawiera na początku header:

#include "control.h"

no a potem definicje klas DialogManager i Dialog które zawierają elementy klas z pliku control.h.
Cała treść pliku opatrzona jest dyrektywą:
#ifndef DIALOG
#define DIALOG
...
#endif

plik dialog.cpp zawiera na początku tylko:
#include "dialog.h"

no i defiinicje a własciwie implementacje ciał metod klas Dialog i DialogManager.

Błąd przy kompilacji to:
error LNK2019: unresolved external symbol na odwołania do metod klasy Dialog w pliku control.cpp

Czy da się coś zrobić aby mimo wszystko mieć 2 headery i 2 pliku źródłowe i by się kompilowało z tymi klasami?

0

Chyba się jednak nie da nic zrobić bez stworzenia trzeciego pliku nagłówkowego i źródłowego w którym będą klasy które są jako pola niewskaźnikowe w klasach w pozostałych 2 plikach.:/ Jakbym przeszedł na wskaźnik do Element w klasie Dialog to wtedy rozwiązanie z 1 mojego posta by działało.

0

W odpowiedzi do postu nr 1 to w dialog.h musisz zrobić include control.h. Jeśli w pliku *.h masz obiekt danej klasy(poprzez deklarację jako member lub gdy dziedziczysz po danej klasie) to musisz zrobić include do odpowiedniego nagłówka, ponieważ kompilator musi wiedzieć co tworzy. Deklaracje wyprzedzające mogą być stosowane tylko w momencie gdy jest wskaźnik - na etapie analizy headera komilator nie potrzebuje wtedy informacji co można zrobić ze wskaźnikiem.

0

to wtedy mam problem z 2 posta. A to dlatego bo klasy z dialog.h i control.h jeszcze mają wskaźniki do samych siebie. Podejrzewam jakiś błąd w linkerze visuala. Już się pogodziłem z tym, że trzeba trzeci header i plik źródłowy stworzyć.

0

Na pewno coś tam da się zrobić. Pokaż kod. Na 99,9999% zrobiłeś błąd, na 0,0001% pomylił się Visual. Najlepiej jakbyś zamieścił minimalny kod kompilujący się w którym występuje problem, czy nawet zamieścił cały projekt chodź to pierwsze byłoby lepsze.

0

To był dobry pomysł z tą minimalizacją. Bo po minimalizacji okazało się że problem nie występuje. Po prostu kod mi sie jednego ze źródłowych plików nie kompilował bo nie był dodany do projektu i stąd errory.:) Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1