Zapętlone includowanie się plików

Odpowiedz Nowy wątek
2015-05-12 20:42

Rejestracja: 7 lat temu

Ostatnio: 3 miesiące temu

Lokalizacja: Częstochowa ~50km

0

Witajcie

Po takim czasie w CPP dopiero teraz potknąłem się na tym i nie wiem co zrobić. :D
Mam coś takiego:


/* resource.hpp */

#ifndef RES
#define RES

#include "manager.hpp"

class res{
friend class manager;
/* Przyjmijmy, że coś w tej klasie jest */
};

#endif

/* manager.hpp */

#ifndef RES_MAN
#define RES_MAN

#include "resource.hpp"

class manager{
/* Przyjmujmy że tutaj tworzyony jest std::vector<res*> wskazniki; 
dlatego musimy zaincludowac resource.hpp, ale beda bledy "res was not declared in this scope" itp.*/
};

#endif

/* WIĘC: Panie phemiesze jak żyć? */

Nie mam pojęcia jak to rozwiązać. Podobny problem był jak chciałem zrobić w innym pliku typedef do Resource.


128 postów [25.06.2015r. 21:03]
edytowany 3x, ostatnio: bajos, 2015-05-12 21:01

Pozostało 580 znaków

2015-05-12 20:45

Rejestracja: 6 lat temu

Ostatnio: 3 dni temu

1

a po co w resource.hpp jest includowany manager.hpp?

@stryku, bo w Resource jest friend class ResouceManager - bajos 2015-05-12 20:47
Mówią, że friend jest niefajny. Jeżeli go masz to pewnie można było lepiej zaprojektować to co piszesz (: - stryku 2015-05-12 20:55

Pozostało 580 znaków

2015-05-12 20:46

Rejestracja: 8 lat temu

Ostatnio: 1 miesiąc temu

2

forward declaration

@Satirev Jak wrzucę nad ResourceManager class Resource{}; to będzie błąd redefinition. - bajos 2015-05-12 20:49
Deklarację masz dać a nie definicję. class Resource; i w *.cpp wrzucasz includa. - satirev 2015-05-12 20:51

Pozostało 580 znaków

2015-05-12 20:46

Rejestracja: 5 lat temu

Ostatnio: 4 miesiące temu

1
class res;

class manager {
   ...
};
Jak wrzucę nad ResourceManager class Resource{}; to będzie błąd redefinition bo Resource includuje ResManagera. - bajos 2015-05-12 20:50
class Resource; - bez nawiasów. - twonek 2015-05-12 20:57

Pozostało 580 znaków

2015-05-12 20:52

Rejestracja: 7 lat temu

Ostatnio: 9 godzin temu

2

W tym wypadku owieczka nie powinna znać pasterza.

Dobre :D - krwq 2015-05-12 20:59

Pozostało 580 znaków

2015-05-12 20:55

Rejestracja: 10 lat temu

Ostatnio: 10 godzin temu

Lokalizacja: Redmond, WA

0

zmien nazwe defina w kazdym z plikow np. na inna:

#ifndef _MANAGER_HPP_
#define _MANAGER_HPP_
...

Dodatkowo w plikach naglowkowych NIE uzywaj zadnych definicji. Tj. np. zmienne statyczne/globalne powinny byc zdefiniowane w plikach zrodlowych nie naglowkowych (w naglowkowych tylko oznajmienie ze zmienna gdzies istnieje: extern static int JestemZdefiniowanyGdziesIndziej;).

Jesli w klasie uzywasz tylko pointerow do innej klasy to nie musisz w ogole uzywac #include, mozesz po prostu napisac:

class A;
class B { A* ptr; };

Jesli w pliku A musisz includowac B a w B includowac A to masz cos zle.


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 4x, ostatnio: krwq, 2015-05-12 21:01
Pomyliły mi się definy bo kopiowałem jak pisałem "na żywo". W normalnym kodzie mam dobrze. ;) - bajos 2015-05-12 21:01

Pozostało 580 znaków

2015-05-12 20:59

Rejestracja: 7 lat temu

Ostatnio: 3 miesiące temu

Lokalizacja: Częstochowa ~50km

0

Jak zrobiłem nad managerem class res; to teraz undeined reference to vtable for res


128 postów [25.06.2015r. 21:03]
Prawdopodobnie nie zaimplementowales ciala jednej z metod - krwq 2015-05-12 21:03
Takze to nie zadziala z friend class - dziala chyba tylko na pointery - krwq 2015-05-12 21:03

Pozostało 580 znaków

2015-05-12 21:04

Rejestracja: 10 lat temu

Ostatnio: 10 godzin temu

Lokalizacja: Redmond, WA

1

Jestes pewien ze potrzebujesz zeby byli przyjaciolmi? Friend class prawie zawsze to zly design.


░█░█░█░█░█░█░█░█░█░█░█░
Pokaż pozostałe 2 komentarze
akcesory oznaczone inline... - spartanPAGE 2015-05-12 21:27
Kompilator prawie zawsze optymalizuje jednolinijkowce do tego samego. Z reszta jesli masz zamiar robic setter i getter to w C++ juz chyba lepiej pole publiczne jesli nie potrzebujesz wywolywac zadnego kodu przy okazji. - krwq 2015-05-12 22:56
A jeśli takie pole jak id i ilosc referencji jest publiczne to mogą się złe rzeczy dziać. - bajos 2015-05-13 21:28
Czemu? Planujesz sobie sam na zlosc robic? - krwq 2015-05-13 23:30
Przecież to zaprzeczenie tej całej ideły hermetyzacji. Oczywiście, że ja wiem do czego będzie wykorzystywane każde pole klasy i na złość nie będę robił sam sobie, ale cały czas byłem w przekonaniu, że takie coś jest nie poprawne. - bajos 2015-05-14 19:34

Pozostało 580 znaków

Odpowiedz

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