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

[C++, dziedziczenie] Rozpoznawanie typu obiektu z poziomu klasy bazowej

Ostatnio zmodyfikowano 2013-10-26 07:47
Autor Wiadomość
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. 
C/C++
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 * Form1;

class Pojazd
{
protected: // niedostępny poza klasą, ale dla pochodnych tak
    AnsiString marka;
    AnsiString model;
    AnsiString masa;
    AnsiString rok_produkcji;
public:
    virtual AnsiString wyswietl() { }; //funkcja, ktora umozliwia wyswietlanie
    // odpowiednich tekstow dla klas Osobowy oraz Ciezarowy
};

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 ]; // wskaznik do tablicy ktora przechowuje ilosc pojazdow
   
    for( int i = 0; i < ile_os; i++ ) // wypelnij osobowymi
    {
        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;
    }
   
}
//---------------------------------------------------------------------------[\cpp]
P-94310
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.
P-94527
seprob
» 2013-10-26 07:47:53
Chodzi o RTTI. Np.:
C/C++
#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;
}
P-94572
« 1 »
  Strona 1 z 1