[C++, dziedziczenie] Rozpoznawanie typu obiektu z poziomu klasy bazowej
Ostatnio zmodyfikowano 2013-10-26 07:47
mifasiek Temat założony przez niniejszego użytkownika |
[C++, dziedziczenie] Rozpoznawanie typu obiektu z poziomu klasy bazowej » 2013-10-22 16:27:53 Witam, chciałbym w jakiś sposób sprawdzić jakiego typu obiekt znajduje się na danym miejscu w tablicy. Mianowicie sprawa wygląda tak: utworzyłem klasę bazową Pojazd oraz dwie klasy pochodne od klasy bazowej Osobowy oraz Ciezarowy. Na podstawie utworzonej przeze mnie funkcji virtual AnsiString tresc() polę ListBox1 zostaje wypełnione obiektami Osobowy oraz Ciezarowy, wszystkie utworzone obiekty znajdują się w tablicy suma[]. Informację o wybranym elemencie z listboxa przechowuję w zmiennej pozycja, chciałbym uzyskać informację jakiego typu został wybrany obiekt i jeżeli Osobowy to chciałbym wykonać pierwszy warunek jeżeli Ciezarowy to drugi warunek. Poniżej zamieszczam, w którym zostało to wykonane za pomocą rzutowania na wskaźnik dynamic_cast. Chciałbym zrobić to samo, tylko, że w inny sposób nie korzystając z rzutowania dynamic_cast. Korzystam z kompilatora Borland Builder 6.
#include <vcl.h> #pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 * Form1;
class Pojazd { protected: AnsiString marka; AnsiString model; AnsiString masa; AnsiString rok_produkcji; public: virtual AnsiString wyswietl() { }; };
class Osobowy : public Pojazd { private: AnsiString liczba_drzwi; AnsiString ilosc_osob; public: Osobowy( AnsiString mar = "Marka", AnsiString mod = "Model", AnsiString ms = "Masa pojazdu", AnsiString rok = "Rok produkcji", AnsiString drzwi = "Liczba drzwi", AnsiString os = "Ilosc osob" ) { marka = mar; model = mod; masa = ms; rok_produkcji = rok; liczba_drzwi = drzwi; ilosc_osob = os; } AnsiString wyswietl() { AnsiString tresc; tresc = "Osobowy , "; tresc += marka; tresc += " , "; tresc += model; tresc += " , "; tresc += masa; tresc += " , "; tresc += rok_produkcji; tresc += " , "; tresc += liczba_drzwi; tresc += " , "; tresc += ilosc_osob; return tresc; } };
class Ciezarowy : public Pojazd { private: AnsiString dlugosc; AnsiString ladownosc; public: Ciezarowy( AnsiString mar = "Marka", AnsiString mod = "Model", AnsiString ms = "Masa Pojazdu", AnsiString rok = "Rok produkcji", AnsiString dl = "Dlugosc pojazdu", AnsiString lad = "Ladownosc pojazdu" ) { marka = mar; model = mod; masa = ms; rok_produkcji = rok; dlugosc = dl; ladownosc = lad; } AnsiString wyswietl() { AnsiString tresc; tresc = "Ciezarowy , "; tresc += marka; tresc += " , "; tresc += model; tresc += " , "; tresc += masa; tresc += " , "; tresc += rok_produkcji; tresc += " , "; tresc += dlugosc; tresc += " , "; tresc += ladownosc; return tresc; } };
__fastcall TForm1::TForm1( TComponent * Owner ) : TForm( Owner ) { }
void __fastcall TForm1::Button1Click( TObject * Sender ) { ListBox1->Clear(); int ile_os = StrToInt( Edit1->Text ); int ile_cz = StrToInt( Edit2->Text ); int suma = ile_os + ile_cz; Pojazd ** tab = new Pojazd *[ suma ]; for( int i = 0; i < ile_os; i++ ) { tab[ i ] = new Osobowy; } for( int i = ile_os; i < suma; i++ ) { tab[ i ] = new Ciezarowy; } for( int i = 0; i < suma; i++ ) { ListBox1->Items->Add( tab[ i ]->wyswietl() ); } }
void __fastcall TForm1::Button2Click( TObject * Sender ) { int pozycja = ListBox1->ItemIndex; Osobowy * os; Ciezarowy * cz; os = dynamic_cast < Osobowy *>( tab[ pozycja ] ); cz = dynamic_cast < Ciezarowy *>( tab[ pozycja ] ); if( os ) { Form2->Show(); Form2->Edit1->Text = os->marka; Form2->Edit2->Text = os->model; Form2->Edit3->Text = os->masa; Form2->Edit4->Text = os->rok_produkcji; Form2->Edit5->Text = os->liczba_drzwi; Form2->Edit6->Text = os->ilosc_osob; } }
|
|
DejaVu |
» 2013-10-25 17:11:12 Wystaw w klasie Pojazd metodę wirtualną, która w klasie potomnej będzie zwracała identyfikator obiektu, informujący o tym jakiego typu jest obiekt. |
|
seprob |
» 2013-10-26 07:47:53 Chodzi o RTTI. Np.: #include <iostream> #include <typeinfo>
using namespace std;
class pojazd { public: virtual void funkcja() { } };
class rower : public pojazd { };
int main() { pojazd p; rower r1, r2; int m = 4; pojazd * wskpj; wskpj = & r2; cout << "Obiekt o nazwie \"p\" jest typu " << typeid( p ).name() << "." << endl; cout << "Obiekt o nazwie \"r1\" jest typu " << typeid( r1 ).name() << "." << endl; cout << "Wskaznik \"wskpj\" pokazuje na typ " << typeid( * wskpj ).name() << "." << endl; }
|
|
« 1 » |