akwes Temat założony przez niniejszego użytkownika |
[C++] Konflikt w klasach. » 2011-06-30 04:33:34 Witam. Oto sytuacja (ostrzegam, bardzo zamotana). Plik main.cpp #include "hero.h" #include "trade.h"
Plik obiekt.h Plik hero.h #include "obiekt.h" class trade; class hero : public obiekt { trade * t1; int a; void fun(); }
Plik trade.h #include "obiekt.h" class hero; class trade { void f( obiekt * ); };
void trade::f( obiekt * ob ) { static_cast < hero *>( ob )->a = 3; }
Błąd kompilacji: trade.h invalid static_cast from type ` obiekt * ' to type `hero*' Jak w klasie trade.h mam skonwertować ten obiekt* na hero* ? (mam pewność że wysyłam hero*) Wcześniej miałem podobny problem ale static_cast go rozwiązał, teraz nie chce. |
|
npHard |
» 2011-06-30 07:28:00 Spróbuj z dynamic_cast. Problem tutaj jest taki, że kompilator w tym miejscu nie wie, że hero dziedziczy po obiekcie. Musiałbyś dołączyć hero.h. Poza tym ciało funkcji lepiej jest umieścić w osobnym pliku .cpp. |
|
akwes Temat założony przez niniejszego użytkownika |
» 2011-06-30 10:01:30 Dla dynamic_cast mam trade.h cannot dynamic_cast ` pierwszy ' (of type `class obiekt*' ) to type ` struct hero * ' (target is not pointer or reference to complete type)
najchętniej bym w każdym pliku inkludował wszystko ale wtedy się wszystko zapętla i jest jeszcze większy syf bo kompilacja trwa nieskończoność bo trade wgrywa hero a hero wgrywa trade. |
|
npHard |
» 2011-06-30 10:13:28 w plikach .h wszystko wsadź w blok ifndef...endif wtedy będzie się dołączało tylko raz. Poza tym tak jak mówię, ciała metod stwórz w osobnych plikach .cpp. Np. dla hero.h zrób tak: #ifndef HERO_H_INCLUDED #define HERO_H_INCLUDED
#include "obiekt.h" class hero : public obiekt { trade * t1; int a; void fun(); }
#endif
|
|
akwes Temat założony przez niniejszego użytkownika |
» 2011-06-30 14:53:53 Nawet z dyrektywami (które mam :P) dzieje się taka głupota że jak mamy na początku #include na wzajem do siebie to i tak będzie w nieskończoność się nawzajem wgrywać, bo nigdy nie zdąży przejść do końca pliku. Może faktycznie rozdzielenie kodu na *.h i *.cpp pomoże. Podzielone, dyrektywy wszystkie są, błąd dalej ten sam. Jednak nie, teraz już nic się nie widzi prawie... #ifndef TRADE_H #define TRADE_H #include "naglowki.h" #include "obiekt.h" class wymiana { public: void obsluga( obiekt *, obiekt * ); }; #endif
#ifndef OBIEKT_H #define OBIEKT_H #include "naglowki.h" #include "mapa.h" #include "lista.h"
class obiekt { public: short x; short y; string znak; map * mapa; lista * list; obiekt() { }; virtual void wypisz() { }; }; #endif
A kompilator nie zna classy obiekt, i mówi mi że brakuje jakiś nawiasów czy cudzysłowów. |
|
Mrowqa |
» 2011-06-30 17:25:54 Z czego korzystasz? Z VC++ ? Jeśli tak to on wymaga dwóch wolnych linii na końcu pliku: ( dziwne, co nie ?? :P ) #ifndef PLIK_H #define PLIK_H
#endif
Ale daj bez komentarza - tu dodałem, bo stronka usuwa zbędne entery :P |
|
Elaine |
» 2011-06-30 17:29:20 Z czego korzystasz? Z VC++ ? Jeśli tak to on wymaga dwóch wolnych linii na końcu pliku |
Ty chyba naprawdę chcesz dostać nagrodę za największą bzdurę, jaka się pojawiła na tym forum. |
|
akwes Temat założony przez niniejszego użytkownika |
» 2011-06-30 17:32:24 To jest mały projekt i pisze go w Dev-C++ ^^
a co do linii, to zawsze robię odstępy bo np. w plikach konfiguracyjnych linuksa brak nowej linii przy ostatnim poleceniu często sprawia że polecenie właśnie nie działa. |
|
« 1 » 2 |