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

[C++] Konflikt w klasach.

Ostatnio zmodyfikowano 2011-06-30 20:20
Autor Wiadomość
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
C/C++
#include "hero.h"
#include "trade.h"

Plik obiekt.h
C/C++
class obiekt { };

Plik hero.h
C/C++
#include "obiekt.h"
class trade;
class hero
    : public obiekt
{
    trade * t1;
    int a;
    void fun();
}

Plik trade.h
C/C++
#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.

P-34989
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.
P-34991
akwes
Temat założony przez niniejszego użytkownika
» 2011-06-30 10:01:30
Dla dynamic_cast mam
C/C++
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.
P-34994
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:
C/C++
#ifndef HERO_H_INCLUDED
#define HERO_H_INCLUDED

#include "obiekt.h"
class hero
    : public obiekt
{
    trade * t1;
    int a;
    void fun();
}

#endif
P-34995
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...

C/C++
// PLIK  trade.h
#ifndef TRADE_H
#define TRADE_H
#include "naglowki.h"
#include "obiekt.h"
class wymiana
{
public:
    void obsluga( obiekt *, obiekt * );
};
#endif

C/C++
// PLIK obiekt.h
#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.
P-35036
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 )
C/C++
#ifndef PLIK_H
#define PLIK_H
/*
  zawartosc pliku
*/
#endif // PLIK_H
// pierwsza linia
// i druga
Ale daj bez komentarza - tu dodałem, bo stronka usuwa zbędne entery :P
P-35044
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.
P-35045
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.
P-35046
« 1 » 2
  Strona 1 z 2 Następna strona