instanceof in C++, vorgehen OOP



  • hallo,

    ich komme aus der schönen java-welt und versuche grad mit c++ zurecht zu kommen. drum meine erste frage...

    1.) was ist das pendant zu instanceof in c++?

    ich möchte zur laufzeit herausfinden von welcher klasse eine instanz abgeleitet worden ist.

    2.) damit in zusammenhang steht diese frage: in java gibt es den datentyp "object". Diesem kann ich ein Objekt von einem beliebigen typ zuweisen. Wenn ich dieses objekt nachher verwenden möchte brauche ich es nur zu casten... wie stelle ich das in c++ an?

    kurzes beispiel dazu:

    object someObj = null;
    someObj = objA;  // objA ist vom Typ MyClassA
    if(someObj instanceof MyClassA)
    {
        MyClassA someA = (MyClassA) someObj;
        someA.doSomeMethod();
    }
    


  • Ich kann Dir leider keine Antwort auf Deine Frage geben, habe aber selbst eine:

    ich möchte zur laufzeit herausfinden von welcher klasse eine instanz abgeleitet worden ist.

    Für was braucht man sowas ? In php gibt es die Möglichkeit ja auch, aber ich weiß damit nichts sinvolles
    anzufangen. (Ich kenne PHP aber kaum).

    thx
    Michael



  • 2. C++ hat dafür ein viel fortgeschriteneres Mittel, die Templates. Damit kannst du Code unabhängig vom verwendeten Typ schreiben und viel mehr. Ansonsten kannst du auch boost::any nehmen (aus der boost-Library)



  • @Kingruedi: OK, schätze dann werd ich mir die Template-Sache doch mal ansehen müssen *seufz* 🙂

    @Knuddlbaer: bei PHP heisst das glaub ich "is_a" und hat den selben zweck wie in java. Wenn du objekt orientiert programmierst (das geht auch mit php ganz gut), hast du oft die situation, dass du eine basisklasse hast und klassen die sich davon ableiten.

    Beispiel:
    Basisklasse: Fahrzeug
    Abgeleitete Klassen: Lastwagen, Cabrio

    Ein einfaches Beispiel: Angenommen du hast ein array voll von fahrzeugen ($fahrzeuge) jeglicher art (also lastwagen, cabrios, ect.) und möchtest auswerten wieviele lastwagen denn nun darin sind, könntest du was in der art machen:

    $lastwagenCount = 0;
    foreach($fahrzeug in $fahrzeuge)
    {
       if(is_a($fahrzeug, "lastwagen"))
          $lastwagenCount++;
    }
    


  • in c++ kannst du sowas mit dynamic_cast machen



  • @tRexx

    thx nun weiß ich endlich für was man das braucht 🤡

    Eigentlich ist es aber so das, sobald man Lastwagen, Panzer,Langdwirtschaftliches KFZ oder was auch immer in ein Array packt es einem Egal ist was nun enthalten ist.
    Es geht einem dann nurnoch um die Basisklasse und virtuellen Funktionen.

    In Deinem Beispiel würde ich das Design prüfen 🤡

    thx, wieder was gelernt :xmas2:



  • Ich persönlich halte es für sinnvoller, in jeder Klasse einen statischen Zähler einzubauen, wieviele Fahrzeuge es von welchem Typ gibt.



  • Optimizer schrieb:

    Ich persönlich halte es für sinnvoller, in jeder Klasse einen statischen Zähler einzubauen, wieviele Fahrzeuge es von welchem Typ gibt.

    das macht noch mehr probleme, z.b. will er ja nur wissen wie viele in den array ist
    außerdem hin mit den counter? in die basis klasse? ne das geht nicht, ode per copy und past jeder neuen classe ein zähler verpassen. ist auch nicht das wahre

    was ist so schlimm an einen typeid oder dynamic_cast, klar es ist ein ansatz punkt wo man optimieren könnte, aber bringt doch erstmal ein programm auf die beine, bevor es losgeht mit den optiemieren
    den sonst wird dein programm schon unüberschaubarer bevor es richtig leuft



  • Halt halt halt! 🙂 Mein beispiel war eh nur dazu da um Knuddlbaer zu erläutern wofür man "is_a" in PHP benutzen *könnte* (also völlig off topic eigentlich) - Somit brauchen wir an dieser stelle auch nicht weiter über sinn und unsinn davon zu diskutieren, oder? *g*

    Was mich viel mehr intressiert wäre eine C++ code beispiel als gegenstück zu meinem java-code-schnippsel... 🙂



  • if(MyClassA* someA = dynamic_cast<MyClassA>(someObj))
      someA->doMethod();
    

Anmelden zum Antworten