Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Problem z podziałem kodu na pliki źródłowe

Ostatnio zmodyfikowano 2010-03-09 20:34
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
[C++] Problem z podziałem kodu na pliki źródłowe
» 2010-03-09 18:07:43
Witam!
Mam takie pliki:
C/C++
//Main.cpp
#include "main.hpp"

int main() {
   
}
C/C++
//Main.hpp
#ifndef MAIN_HPP
#define MAIN_HPP

#include "definicje.hpp"
#include "bohater.hpp"

#endif
C/C++
//Definicje.hpp
#ifndef DEFINICJE_HPP
#define DEFINICJE_HPP

enum RASA { ZERG, PROTOSS, TERRAN };

#endif
C/C++
//Bohater.hpp
#ifndef BOHATER_HPP
#define BOHATER_HPP

class Bohater {
    RASA rasa;
    Bohater();
};

#endif
C/C++
//Bohater.cpp
#include "bohater.hpp"

Bohater::Bohater() {
    rasa = ZERG;
}

Na początku wklejam zawartość Definicje.hpp, a potem Bohater.hpp, który dołącza Bohater.cpp. Problem polega na tym, że ani Bohater.hpp, ani Bohater.cpp nie widzi zawartości Definicje.hpp, która już wcześniej zostałą dołączona. Dlaczego tak się dzieje?

-----------------------
malan:
Zmieniałem nazwę tematu.
P-14809
Elaine
» 2010-03-09 18:14:24
Bo nie dołączasz tego w bohater.hpp?
P-14810
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-09 18:42:55
Z tego co wiem '#include' wkleja kod(Przynajmniej w PHP tak działa). Więc teoretycznie otrzymujemy taki plik:
C/C++
enum RASA { ZERG, PROTOSS, TERRAN };

class Bohater {
    RASA rasa;
    Bohater();
};

Bohater::Bohater() {
    rasa = ZERG;
}
int main() {
   
}

Jeśli tak nie jest to powstaje problem, gdy 2 różne klasy są w osobnych plikach i są ze sobą związane. Np:

C/C++
//gra.hpp
#ifndef GRA_HPP
#define GRA_HPP

#include "bohater.hpp"

class Gra {
public:
    int numer;
    int rasa;
    void Przypisz( Bohater boh );
};

#endif
C/C++
//gra.cpp
#include "gra.hpp"

void Gra::Przypisz( Bohater boh ) {
    rasa = boh.rasa;
}
C/C++
//bohater.hpp
#ifndef BOHATER_HPP
#define BOHATER_HPP

#include "gra.hpp"

class Bohater {
public:
    int rasa;
    int numer;
    Bohater();
    void Num( Gra gra );
};

#endif
C/C++
//bohater.cpp
#include "bohater.hpp"

void Bohater::Num( Gra gra ) {
    numer = gra.numer;
}
P-14811
Elaine
» 2010-03-09 18:50:28
Tak. A co się dzieje w bohater.cpp? Po przejściu przez preprocesor zostaje:
C/C++
class Bohater {
    RASA rasa;
    Bohater();
};

Bohater::Bohater() {
    rasa = ZERG;
}
Skąd kompilator ma wiedzieć, co to RASA i ZERG? Nie zna tych symboli. Przydałoby się mu powiedzieć o tym, co one oznaczają - najlepiej poprzez dołączenie definicje.hpp.
P-14812
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-09 18:59:28
Zrozumiałem to tak, że kompilator nie wkleja bezpośrednio plików do pliku głównego, tylko najpierw łączy odpowiednie ze sobą i kompiluje, a potem dołącza do kolejnych. Takie jakby drzewo:
drzewo
Dobrze to zrozumiałem?
P-14813
Elaine
» 2010-03-09 19:10:02
Źle zrozumiałeś... #include to zwykłe kopiuj-wklej zawartości dołączanego pliku... Po prostu natura C (więc i C++) jest taka, że każdy jeden plik źródłowy trzeba przetwarzać oddzielnie.
P-14814
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-09 19:20:21
Więc trzeba tak napisać każdy plik (bohater.hpp), aby działał nawet bez pliku, który go wywołuje(main.hpp), żeby te pliki się oddzielnie skompilowały, a następnie złączyły w jedność. Jeśli dobrze zrozumiałem, to dzięki! Pozostaje problem, gdy jedna klasa jest związana z drugą. (wcześniej w tym temacie ten problem poruszyłem.
P-14815
Elaine
» 2010-03-09 19:53:56
Forward declaration i używanie (const-)refów czy tam wskaźników zamiast wartości?
P-14818
« 1 » 2
  Strona 1 z 2 Następna strona