kamil7124 Temat założony przez niniejszego użytkownika |
Kilka klas pochodnych, każda w innym pliku » 2016-04-07 16:43:27 Mam w programie klasę bazową i dwie klasy które publicznie tę klasę dziedziczą. Mam też takie założenie, że każda klasa musi być w osobnym pliku (każda klasa - 1 plik *.cpp i 1 plik *.h). Nie wiem jednak jak utworzyć obiekt klasy pochodnej z poziomu pliku main.cpp. Oto jak wyglądają pliki mojego projektu: main.cpp #include <iostream>
using namespace std;
int main() { return 0; }
bazowa.h class bazowa { private: int dlugoscBoku; public: void ustawdlugoscBoku( int i ); };
bazowa.cpp #include "bazowa.h"
void bazowa::ustawdlugoscBoku( int i ) { dlugoscBoku = i; }
pochodna.h #include "bazowa.h" class pochodna : public bazowa { private: int glebokosc; public: void ustawGlebokosc( int i ); };
pochodna.cpp #include "pochodna.h"
void pochodna::ustawGlebokosc( int i ) { glebokosc = i; }
druga_pochodna.h #include "bazowa.h"
class druga_pochodna : public bazowa { private: int costam; public: void ustawCostam( int i ); };
druga_pochodna.cpp #include "druga_pochodna.h"
void druga_pochodna::ustawCostam( int i ) { costam = i; }
|
|
Rashmistrz |
» 2016-04-07 18:57:05 Emmm?! : pochodna nazwa_obiektu;
nazwa_obiektu.ustawGlebokosc( 42 ); Klas używa się jak struktur... W zasadzie... struktury to też klasy, tylko że nie mają metod. :D |
|
carlosmay |
» 2016-04-07 19:06:18 |
|
kamil7124 Temat założony przez niniejszego użytkownika |
» 2016-04-07 20:41:15 Nie o to mi chodzi ;) Problem jest w tym, że nie wiem jak dołączyć pliki *.h do main.cpp. Jeśli zrobię w ten sposób: #include "pochodna.h" #include "druga_pochodna.h"
to z racji tego, że zarówno w pochodna.h jak i w druga_pochodna.h jest Kompilator wywali mi błąd, ponieważ pośrednio (przez pliki nagłówkowe pochodnych) dwa razy dołączyłem plik bazowa.h, a on to widzi tak jakbym za dużo razy zdefiniował klasę bazową. Moje pytanie brzmi - czy jest jakiś sposób żeby to obejść, czy może jestem zmuszony umieszczać wszystkie klasy pochodne w jednym pliku? Ps.: Wiem że powinienem był to umieścić w pierwszym poście, zapomniałem ;( |
|
carlosmay |
» 2016-04-07 20:56:38 Możesz tego spróbować. #ifndef nazwaPliku_hpp #define nazwaPliku_hpp
#endif Choć nie wiem czy pomoże. Kompilator wywali mi błąd, ponieważ pośrednio (przez pliki nagłówkowe pochodnych) dwa razy dołączyłem plik bazowa.h |
Bazową zrób klasą abstrakcyjną. Lepiej zaprojektuj klasy. |
|
mokrowski |
» 2016-04-07 21:17:42 1. Porzuć raczej przyzwyczajenie nazywania plików nagłówkowych dla C++ z końcówką *.h. Takie pliki sugerują że dają się użyć w kontekście języka C a u Ciebie to nie prawda. Nazywaj je raczej *.hpp lub.. jeszcze inaczej (konwencji jest bez liku), ale nie *.h 2. Zamiast już dość leciwej techniki użycia makr wartowniczych (co pokazał kolega carlosmay), warto użyć pragmy. W niektórych przypadkach działa szybciej (wiele nagłówków) a po drugie wszędzie gdzie się da należy unikać makr :-) Twój plik bazowa.h będzie wyglądał wtedy tak: #pragma once
class bazowa { private: int dlugoscBoku; public: void ustawdlugoscBoku( int i ); };
3. W C++ nie ma obowiązku "zwracania zera z main()". To było wymaganie dla C (bez plusów). W C++ kompilator w main() sam podstawia zero jeśli nie wpiszesz return. |
|
Elaine |
» 2016-04-08 05:21:18 Zamiast już dość leciwej techniki użycia makr wartowniczych (co pokazał kolega carlosmay), warto użyć pragmy. | #pragma once, choć może się wydawać atrakcyjne, w rzeczywistości jest problematyczne, ponieważ nie ma ściśle określonej semantyki. Co dokładnie robi #pragma once? Pod każdym kompilatorem, który to implementuje, powoduje, że tylko pierwsze #include danego pliku ma efekt. To wydaje się łatwe, proste i przyjemne, ale jest niemożliwe do zaimplementowania, bowiem w dzisiejszych systemach operacyjnych nie da się określić, czy dwie ścieżki określają ten sam plik. W praktyce kompilatory przybliżają to porównując numer urządzenia i iwęzła, ale w Prawdziwym Świecie™ łatwo doprowadzić do sytuacji, w której dwa pliki o różnej parze (dev, ino) są w rzeczywistości tym samym plikiem; nie mówiąc już o zwyczajnej kopii pliku (zawartość ta sama, inny plik). Tradycyjne wartowniki nie mają z poprawnym zachowywaniem się w takich sytuacjach żadnego problemu. W niektórych przypadkach działa szybciej (wiele nagłówków) |
Kompilatory potrafią rozpoznawać wartowniki i używać dla nich tej samej logiki, co dla #pragma once. W C++ nie ma obowiązku "zwracania zera z main()". To było wymaganie dla C (bez plusów). |
W C main również może nie kończyć się returnem, i również jest to równoważne return 0. |
|
kamil7124 Temat założony przez niniejszego użytkownika |
» 2016-04-08 07:47:27 Na razie wypróbowałem technikę z #ifndef/#define/#endif, oraz z #pragma once. Obie działają jak należy, więc dziękuje Wam ;) Z klasą abstrakcyjną pokombinuję jak będę miał więcej czasu. |
|
« 1 » |