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

[Allegro5] Biblioteka Header-Only

Ostatnio zmodyfikowano 2010-03-13 22:12
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
[Allegro5] Biblioteka Header-Only
» 2010-03-13 16:54:20
Witam!
Napisałem sobie bibliotekę (chyba Header-Only) na podstawie Allegro5. Wszystkie jej pliki wyglądają mniej więcej tak:
C/C++
#ifndef TIMER_HPP
#define TIMER_HPP

class Timer {
    //---
};

#endif
Gdy w projekcie piszę plik z clasą w ten sposób:
C/C++
#ifndef BOHATER_HPP
#define BOHATER_HPP

class Bohater {
public:
    Timer czas;
    Bohater() {
        czas = Timer( 1 );
    }
};
To wszystko pięknie działa. Natomiast jeżeli plik rozdzielę na 2:
C/C++
#ifndef BOHATER_HPP
#define BOHATER_HPP

class Bohater {
public:
    Timer czas;
    Bohater() {
        czas = Timer( 1 );
    }
};
C/C++
#include "bohater.h"
Bohater::Bohater() {
    czas = Timer( 1 );
}
To projekt się nie chce skompilować i wyskakują błędy:

loh.h(5) : error C2146: syntax error : missing ';' before identifier 'czas'
loh.h(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
loh.h(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
loh.cpp(4) : error C2065: 'czas' : undeclared identifier
1>c:\documents and settings\user\moje dokumenty\visual studio 2008\projects\zabawaloh.cpp(4) : error C3861: 'Timer': identifier not found

Potrzebuję rozbić plik na części aby zastosować Forward declaration. Istnieje jakiś sprytny sposób na załatwienie tego problemu, czy będę musiał przerabiać całą bibliotekę, żeby każdy plik był podzielony na h i cpp?
P-14971
Elaine
» 2010-03-13 17:35:16
Pokaż kod. Ten prawdziwy.
P-14974
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-13 18:09:50
To jest paczka z moją biblioteką i projektem:paczka. Nie chciałem jej tu wklejać, bo jest tego sporo. Nie wszystkie pliki tej biblioteki są wg powyższego schematu (header-only), ale te testowane owszem.
P-14978
Elaine
» 2010-03-13 18:17:16
Kompilator nie jest jasnowidzem, jeśli mu nie powiesz o istnieniu jakiegoś symbolu, to nie będzie go znał. Przy kompilacji loh.cpp widzi coś takiego:
C/C++
class Loh {
    Timer t;
    Loh();
};

Loh::Loh() {
    t = Timer( 50 );
}
Pytanie za 666 groszy: skąd kompilator ma wiedzieć, co to Timer?

Rozwiązanie: jeśli header od czegoś zależy, to dołącz w nim wszystko, co jest potrzebne. Bez tego będziesz miał wesołe błędy typu ten wyżej.
P-14979
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-13 18:48:28
Ale gdy plik nagłówkowy wygląda tak:
C/C++
#ifndef LOH_HPP
#define LOH_HPP

class Loh {
    Timer t;
    Loh() {
        t = Timer( 50 );
    }
};

#endif
i nie ma pliku źródłowego o tej samej nazwie to wszystko pięknie działa.
P-14980
Elaine
» 2010-03-13 19:15:51
Bo widocznie w innym pliku źródłowym kolejność #include'ów jest taka, że kompilator widzi wszystko, co mu jest potrzebne. Czysty przypadek. Jak coś zmienisz, to wszystko może się posypać, więc lepiej to jednak popraw.
P-14982
steckel
Temat założony przez niniejszego użytkownika
» 2010-03-13 19:21:43
więc lepiej to jednak popraw.
Masz na myśli przerobienie tej biblioteki, żeby już nie była header-only, czy tylko ten projekt?
P-14983
Elaine
» 2010-03-13 19:26:50
Rozwiązanie: jeśli header od czegoś zależy, to dołącz w nim wszystko, co jest potrzebne. Bez tego będziesz miał wesołe błędy typu ten wyżej.
P-14984
« 1 » 2
  Strona 1 z 2 Następna strona