Typ des Pointers ueberpruefen



  • Hallo!

    Ich moechte pruefen, ob ein Pointer von einem bestimmten Typ ist. Folgendes habe ich dazu gemacht:

    void Test::update(void *sender)
    {
      if ( (MyObject*) sender != 0) )
      {
        //DoSomething
      }
    }
    

    Ich moechte in diesem Fall also pruefen, ob sender vom Typ "MyObject" ist.
    Egal von welchem Typ das uebergebene Objekt bei "update" ist, die if-Bedingung ist immer true. Warum ist das so? Was mache ich falsch ?

    Dankeschoen fuer die Hilfe!
    Andy



  • Hi,

    3 Dinge:
    1.) dynamic_cast<> kann das prinzipiell aber
    2.) die "eingebaute" Laufzeitpolymorphie ist unendlich viel besser als "manuell gebastelte" .
    3.) Falls Du daran denkst, C++-Objekte "binär zu transportieren" (über die Leitung oder ein File): Lieber nicht.

    Gruß,

    Simon2.



  • Weil kein dynamic_cast verwendet wird.
    Das ist mit ein Grund, warum die C++ casts verwendet werden sollten: Man muss wissen was man tut und was passiert.

    Abhilfe für dein Problem würde ein Interface (abstrakte Klasse) mit der Update Methode machen.

    Simon



  • Simon2 schrieb:

    2.) die "eingebaute" Laufzeitpolymorphie ist unendlich viel besser als "manuell gebastelte" .

    Danke fuer die Antwort, aber das verstehe ich nicht ganz... Welche eingebaute Laufzeitpolymorphie meinst du?



  • Sowas in etwa:

    //interface
    struct Updatable
    {
        virtual void update() = 0;
    };
    
    //irgendwas, das geupdated werden kann
    class SenderType_A : public Updatable
    {
    public:
        //...
        void update()
        {
            std::cout << "Update A\n";
            //...
        }
    private:
        //...
    };
    
    //irgendwas anderes, das geupdated werden kann
    class SenderType_B : public Updatable
    {
    public:
        //...
        void update()
        {
            std::cout << "Update B\n";
            //...
        }
    private:
        //...
    };
    
    //eine Funktion die updated
    void test(Updatable& objectToUpdate)
    {
        //...
        objectToUpdate.update();
        //...
    }
    
    int main()
    {   
        //ein updatebares Objekt
        SenderType_A sender_A;
        //ein anderes updatebares Objekt
        SenderType_B sender_B;
    
        //beide updaten
        test(sender_A);
        test(sender_B);
    }
    


  • ... oder sowas (habe grob deine Nomenklatur und Semantik übernommen - sei sie nun ideal oder nicht):

    struct MyObject { // ist einfach eine "public-class" (bin faul)
       virtual void DoSomething() = 0; // MUSS für Benutzung überschrieben werden
       virtual ~MyObject() {} // Dtor sollte bei "abzuleitenden Klassen" virtual sein.
    };
    
    struct MySpecialObject1 : MyObject {
       void DoSomething() { cout << "mache dies\n"; }
    };
    
    struct MySpecialObject2 : MyObject {
       void DoSomething() { cout << "mache das\n"; }
    };
    
    struct Test {
       void update(MyObject *sender) {   sender->DoSomething();  }
    };
    
    int main() {
       Test t;
       MySpecialObject1 mo1;
       MySpecialObject2 mo2;
    
       t.update(&mo1); // => "mache dies"
       t.update(&mo2); // => "mache das"
    ...
    

    Gruß,

    Simon2.



  • Simon2 schrieb:

    [...]

    Sollten die "SpecialObjects" nicht von MyObject erben?



  • Tachyon schrieb:

    Simon2 schrieb:

    [...]

    Sollten die "SpecialObjects" nicht von MyObject erben?

    Das Testament wird momentan noch von "Test" angefochten.



  • Tachyon schrieb:

    Simon2 schrieb:

    [...]

    Sollten die "SpecialObjects" nicht von MyObject erben?

    😮 🙄 😮 💡 👍
    Natürlich!

    Danke,

    Simon2.


Anmelden zum Antworten