Struktura programu obiektowego c++ (deklaracja struktury)

Odpowiedz Nowy wątek
2016-03-30 23:17

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

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?

Pozostało 580 znaków

2016-03-30 23:20

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

2
//position.hpp
#pragma once

struct position { 
    /* whatever */ 
};
//foo.hpp
#pragma once
#include "position.hpp"
//bar.cpp
#include "position.hpp"
edytowany 3x, ostatnio: spartanPAGE, 2016-03-30 23:21

Pozostało 580 znaków

2016-03-30 23:30

Rejestracja: 7 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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;
 }

Asm/C/C++
edytowany 4x, ostatnio: mwl4, 2016-03-30 23:36

Pozostało 580 znaków

Odpowiedz

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