Struktura programu obiektowego c++ (deklaracja struktury)

0

Witam,
mam pewien problem. Chciałem napisać program obiektowy, w którym są 2 klasy i rozłożone są w 2 odpowiednich plikach nagłówkowych i 2 źródłowych. Mam z tym mały mętlik, sytuacja wygląda następująco: potrzebna mi jest struktura position, której deklaracje umieściłem w jednym z plików nagłówkowych przed deklaracją klasy. Wszystko działało, tzn. mogłem bez problemu korzystać z struktury w pliku 1 pliku nagłówkowym(gdzie jest jej definicja) w źródłowym związanym z tym plikiem nagłówkowym i w pliku main.cpp. Natomiast problem pojawił się gdy chciałem wykorzystać strukturę position w 2 pliku nagłówkowym i związanym z nim źródłowym "'position' has not been declared" Chciałem w takim wypadku zadeklarować ponownie strukturę w tamtym miejscu, lecz kompilator wywala mi błąd "redefinition of 'struct position'".

Nie wiem co zrobić w takiej sytuacji, gdzie powinienem zapisać deklarację struktury?

2
//position.hpp
#pragma once

struct position { 
    /* whatever */ 
};
//foo.hpp
#pragma once
#include "position.hpp"
//bar.cpp
#include "position.hpp"
0

To zależy w jaki sposób chcesz wykorzystać pierwszą klasę w drugim pliku nagłówkowym. Jeśli to ma być wskaźnik lub referencja lub obiekt klasy jako argument metody to możesz użyć forward declaration. Natomiast jeśli potrzebujesz zdefiniować i zadeklarować obiekt klasy lub odziedziczyć lub odwołać się do pól z klasy to już musisz includować plik h.

Wersja z forward declaration:

/* foo2.h */
 #pragma once
 class foo;
 class foo2
 {
 public:
 	 void f(foo a);	
 };

/* foo.h */
 #pragma once
 class foo
 {
 public:
 	 int x;
 };

/* foo2.cpp */
 #include "foo2.h"
 #include "foo.h"
 void foo2::f(foo a)
 {
 	 a.x = 5;
 }

/* main.cpp */
 #include "foo2.h"
 #include "foo.h"
 #include <iostream>
 using namespace std;

 int main() {
	 foo2 f2;
	 foo f1;
	 f2.f(f1);
	 return 0;
 }
 

Wersja z includowaniem:

/* foo2.h */
 #pragma once
 #include "foo.h"
 class foo2
 {
 	 foo obiekt;
 };

/* foo.h */
 #pragma once
 class foo
 {
 public:
 	 int x;
 };

/* foo2.cpp */
 #include "foo2.h"
 #include "foo.h"
 // pusto, brak metod

/* main.cpp */
 #include "foo2.h"
 #include "foo.h"
 #include <iostream>
 using namespace std;

 int main() {
	 foo2 f2;
	 foo f1;
	 f2.f(f1);
	 return 0;
 }
 

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