Czy istnieje zasada odnośnie includowania klas w innych klasach?

0

Witam, mam problem który, jak sądzę, wynika z mojej niewiedzy z dziedziny programowania obiektowego. Próbowałem szukać odpowiedzi na google, ale jakoś nie mogę znaleźć nic pomocnego.

Mam program, w którym dwa obiekty się nawzajem atakują: Creature i Zamek (wiem, że część jest po polsku, część po angielsku, jeszcze nie wyrobiłem sobie spójnego sposobu nazywania klas, dopiero się uczę na tych programach).
Najpierw napisałem klasie Creature funkcję Atakuj do atakowania Zamku, więc musiałem w Creature wpisać #include "ClassZamek.h". Wszystko działało. Dzisiaj z kolei napisałem funkcję Atakuj dla Zamku, więc w Zamku dodałem #include "ClassCreature.h". Wtedy pojawił się błąd kompilacji:
classcreature.h(12): error C2061: syntax error : identifier 'Zamek'
ClassCreature dzisiaj nie zmieniałem, stąd domyślam się, że może chodzi o wzajemne includowanie się Zamku i Creature.
Czy istnieje jakaś zasada odnośnie współpracy ze sobą klas? Jakiś jeden wspólny plik nagłówkowy w którym są includowane inne pliki nagłówkowe, lub coś w tym stylu?
Zamieszczam poniżej wycinki klas, gdzie "pracują na sobie nawzajem", może mój błąd jest gdzieś indziej.
ClassCreature.h

#include "ClassZamek.h"
class Creature{
public:
	void Attack(Zamek* zamek);

ClassCreature.cpp

void Creature::Attack(Zamek* zamek){
	zamek->Trafienie(m_dmg);
}

ClassZamek.h

#include "ClassCreature.h"
class Zamek{
public:
	void Atakuj(vector<Creature>* enemies);

ClassZamek.cpp

void Zamek::Atakuj(vector<Creature>* enemies){
	ItWieza->Atakuj(enemies);
}

Może jeszcze jakieś zastrzeżenia odnośnie kodu? Jeśli chodzi o programowanie obiektowe, to jestem samoukiem, więc każdy wykład mile widziany :)

0

zrób tak:

ClassCreature.h

#ifndef CLASS_CREATURE_H
#define CLASS_CREATURE_H
 
#include "ClassZamek.h"
class Creature{
public:
        void Attack(Zamek* zamek);
        ...
};

#endif

i podobnie w każdym innym pliku .h

PS.

void Zamek::Atakuj(vector<Creature>* enemies){
wskaźnik na vector? czy miał być raczej vector wskaźników?

vector<Creature*> enemies
0

Mam już wszystkie nagłówki w "#ifndef ClassCreature_h", jedyne czym się różni od podanego przez Ciebie to same wielkie litery i rozdzielenie słów CLASS i CREATURE.

I tak, używam wskaźnika do wektora obiektów, w jednym miejscu będzie nawet wskaźnik do wektora wskaźników, bo będę używał wielu rodzajów obiektu, więc będą to wskaźniki do klasy macierzystej. Czy to zła praktyka?

0

zamiast wskaźnika do vectora użyj referencji, jak _13th_Dragon pokazał.

0
Hadeus napisał(a):

I tak, używam wskaźnika do wektora obiektów, w jednym miejscu będzie nawet wskaźnik do wektora wskaźników, bo będę używał wielu rodzajów obiektu, więc będą to wskaźniki do klasy macierzystej. Czy to zła praktyka?

Nie ma sensu przekazywać czegoś przez wskaźnik kiedy można przez referencję.

Tak a propos, zastanów się nad klasą BattleField, wtedy niby nie ma wzajemnego atakowania Zamku i Bestii. Walka toczy się na polu walki, wraz z rozstrzygnięciem wyniku. W wielu miejscach nie będziesz musiał praktycznie dublować kodu.

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