[C++] Jak sprawdzić typ obiektu klasy pochodnej?


(Ziom32) #1

Witam.

Mam następujący problem:

W moim programie są 3 klasy: Pracownik, Sprzedawca opraz Portier. Dwie ostatnie klasy są klasami pochodnymi od Pracownika. W programie wszystko dobrze działa, funkcje wirtualne uruchamiają się bez problemów, operatory we/wy również.

Problem pojawia się, przy zapisywaniu listy pracowników do pliku. Na liście jednokierunkowej wszystkie elementy(czy to Sprzedawca, czy Portier) są przechowywane jako Pracownik *.

Operatory we/wy nie mogą być funkcjami wirtualnymi i w związku z tym nie wiem, jak poprawnie zapisywać elementy do pliku(Portier i Sprzedawca mają przeładowane własne operatory we/wy). Musiałbym przy każdym Pracowniku(Portierze/Sprzedawcy) znać typ i stąd pytanie jak go sprawdzić.

Z góry dzięki za pomoc.


(Frankfurterium) #2

http://stackoverflow.com/questions/5004 ... instanceof


(Ziom32) #3

Pomogło. Dzięki wielkie:)


(Blapiter) #4

W C++ instanceof można porównać do typeid:

#include 

#include 


using namespace std;


class Pracownik

{

public:

    virtual void Kto() const { cout << "Jestem Pracownik!" << endl; }

    virtual ~Pracownik(){cout<<"KASOWANIE_PRACOWANIK\n";};

};


class Sprzedawca : public Pracownik

{

public:

    void Kto() const { cout << "Jestem Sprzedawca!" << endl; }

    ~Sprzedawca(){cout<<"KASOWANIE_Sprzedawca\n";};

    friend ostream & operator<<(ostream & ekran, const Sprzedawca & obj)

    {

        ekran<<"Jestem Sprzedawca z przeciazonego <
        return ekran;

    }

};


class Portier : public Pracownik

{

public:

    void Kto() const { cout << "Jestem Portier!" << endl; }

    ~Portier(){cout<<"KASOWANIE_Portier\n";};

    friend ostream & operator<<(ostream & ekran, const Portier & obj)

    {

        ekran<<"Jestem Portier z przeciazonego <
        return ekran;

    }

};



int main(int argc, char ** argv)

{

    vector Pracownicy;

    Pracownicy.push_back( new Sprzedawca() );

    Pracownicy.push_back( new Portier() );


    for(vector::iterator it = Pracownicy.begin(); it != Pracownicy.end(); it++)

    {

        if(typeid(*(*it))==typeid(Sprzedawca))

        {

            cout<
            Sprzedawca * sp = dynamic_cast(*it);

            sp->Kto();

            cout<<*sp;

        }

        else if(typeid(*(*it))==typeid(Portier))

        {

            cout<
            Portier * po = dynamic_cast(*it);

            po->Kto();

            cout<<*po;

        }

        delete *it;

    }


    cin.sync();

    cin.get();

    return 0;

}