Informacja o typie klasy pochodnej?

0

Cześć,
załóżmy, że mam pewną klasę bazową oraz dziedziczące z niej klasy pochodne.
W określonym miejscu programu potrzebuję wiedzieć, jaki jest typ klasy pochodnej.
Czy jest możliwość wydobycia tej informacji za pomocą składni C++ i czy jest to właściwie postępowanie, czy też powinienem stworzyć odpowiednie metody w klasach pochodnych, zwracające informacje o typie konkretnej klasy pochodnej?

Pozdrawiam,
Marek

0

Nie wiem czy w C++ jest to osiągalne, jednakże generalnie powinno się unikać takiej sytuacji gdzie musisz rozróżniać który to jest konkretnie typ. Do czego tego potrzebujesz?

0

Możesz próbować rzutować za pomocą dynamic_cast, możesz zrobić jakąś metodę wirtualną, która zwróci nazwę klasy, możesz użyć RTTI. Ale w sumie żadna z tych opcji nie jest idealna i jeżeli musisz to zrobić to w większości (nie wszystkich, ale jednak większości) przypadków jest to błąd projektowy.

0

Słowo klucz do gógla - RTTI

0

W takim razie wydaje mi się, że metoda wirtualna zwracająca nazwę klasy jest w porządku.
Załóżmy, że mamy szachownicę i figury szachowe na tej szachownicy.
Mamy:

class Square {
     Piece *piece;
     public: String getPiece() { return piece->whoAmI(); }
};
 

Klasa Piece jako klasa bazowa dla różnych figur jest dla mnie bardzo wygodna. Ze sprawdzania typu klasy pochodnej będę intensywnie korzystał, ale
nie widzę, by miało to powodować problemy w tym projekcie.
Czy sugerujecie jakieś inne rozwiązanie?

Pozdrawiam,
Marek

0

można pokusić się o taką zabawę ale raczej jest to bardziej w formie ciekawostki.

#include <iostream>
#include <string>
#include <cxxabi.h>

template<class T>
    inline std::string realName(const T &obj) {
        return std::string(abi::__cxa_demangle(typeid(obj).name(), 0, 0, 0));
    }

class Base {
    public:
        Base(){}
        virtual ~Base(){}
};

class DerivativeSt : public Base {
    public:
        DerivativeSt(){}
        ~DerivativeSt(){}
};


int main()
{
    Base *b = new DerivativeSt();
    DerivativeSt *st = new DerivativeSt();

    std::cout << realName(b) << "\n" << realName(*b) << "\n"
              << realName(st);

    return 0;
}

Nie jest to jednak mechanizm samego języka, który nie udostępnia takiej możliwości.

0

Ze sprawdzania typu klasy pochodnej będę intensywnie korzystał
Skoro tak, to po co Tobie dziedziczenie. Zrób enuma z typem pionka i tyle :| ...

0

Ok, w tym przypadku to jest rozwiązanie, bo klasa Piece nie będzie zawierać zbyt wielu metod.
Co jednak, gdyby była tam cała garść metod, z których cała garść musiałaby być przeciążana?
Dalej można korzystać z typu wyliczeniowego i zamiast metody klasy Piece przekazywać Piece jako argument do danej metody, tylko, że w ten sposób rezygnujemy właściwie z C++ i ograniczamy się do zwykłego C.
Jak rozwiązać ten problem?

0

Opisz dokładniej na przykładzie dlaczego potrzebowałbyś rozpoznawać typy pochodne. Najpewniej da się to zrobić dziedziczeniem.
Weźmy dla przykładu pionek na szachownicy. Gracz wskazuje pionek i miejsce docelowe. Wywoływana jest metoda klasy AbstractPawn::CheckMove() która sprawdza czy można się przemieścić na dane pole. Każdy pionek będzie mieć swoją wersję tej metody, bo każdy pionek inaczej się po szachownicy przemieszcza. Nie potrzebujesz w danym fragmencie kodu wiedzieć, czy to jest konik czy królowa, ponieważ zostanie wywołana odpowiednia metoda mimo, że masz wskaźnik do obiektu klasy AbstractPawn.

0

Co jednak, gdyby była tam cała garść metod, z których cała garść musiałaby być przeciążana?
To wtedy odpowiednią funkcjonalność umieszczasz w metodzie wirtualnej i nie potrzebujesz z zewnątrz sprawdzać typu.

0

[quote]Opisz dokładniej na przykładzie dlaczego potrzebowałbyś rozpoznawać typy pochodne. Najpewniej da się to zrobić dziedziczeniem.
Weźmy dla przykładu pionek na szachownicy. Gracz wskazuje pionek i miejsce docelowe. Wywoływana jest metoda klasy AbstractPawn::CheckMove() która sprawdza czy można się przemieścić na dane pole. Każdy pionek będzie mieć swoją wersję tej metody, bo każdy pionek inaczej się po szachownicy przemieszcza. Nie potrzebujesz w danym fragmencie kodu wiedzieć, czy to jest konik czy królowa, ponieważ zostanie wywołana odpowiednia metoda mimo, że masz wskaźnik do obiektu klasy AbstractPawn.[/quote]

OK. Ale przy programowaniu modułu sztucznej inteligencji, coraz będzie konieczne sprawdzać, jaka bierka stoi na określonym polu.
Po to dokładnie m.in. chcę rozpoznawać typy pochodne.

Pozdrawiam,
Marek

0

To nie sprawdzaj klasy obiektu,tylko zrób jak ci koledzy podpowiadali już enuma FigureType w klasie bazowej i tyle.

0

Jeszcze co do pierwszego pytania moze cos takiego by sie zdalo?

http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node153.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1