Jeweils anderes Objekt in Funktion erzeugen



  • Hallo!

    Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:

    class Interfaceklasse {
    public:
    virutal void foo() = NULL;
    };

    class A: public Interfaceklasse {
    public:
    void foo();
    };

    class B: public Interfaceklasse {
    void foo();
    };

    Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.

    void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1 Objekt der Klasse B erzeugen
    InterfaceKlasse* newObject = NULL;
    if(AorB == 0) {
    newObjekt = new A;
    } else if(AorB == 1) {
    newObjekt = new B;
    }
    }

    Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...

    Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:

    void bar(char* NameOfClass) {
    InterfaceKlasse* newObject = new NameOfClass;
    }
    Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...

    Danke für die Hilfe 👍



  • }
    void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1 Objekt der Klasse B erzeugen
    InterfaceKlasse* newObject = NULL;

    Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...
    };

    class B: public Interfaceklasse {
    void foo();
    };
    Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...

    Danke für die Hilfe 👍

    Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.

    void bar(char* NameOfClass) {
    InterfaceKlasse* newObject = new NameOfClass;
    }

    Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:

    class Interfaceklasse {
    public:
    virutal void foo() = NULL;
    };
    Hallo!

    Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:
    if(AorB == 0) {
    newObjekt = new A;
    } else if(AorB == 1) {
    newObjekt = new B;
    }
    class A: public Interfaceklasse {
    public:
    void foo();

    😃



  • Witzigwitzig

    Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:

    class Interfaceklasse {
    public:
    virutal void foo() = NULL;
    };
    
    class A: public Interfaceklasse {
    public:
    void foo();
    };
    
    class B: public Interfaceklasse {
    void foo();
    };
    

    Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.

    void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1
        Objekt der Klasse B erzeugen
        InterfaceKlasse* newObject = NULL;
        if(AorB == 0) {
            newObjekt = new A;
        } else if(AorB == 1) {
            newObjekt = new B;
        }
    }
    

    Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...

    Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:

    void bar(char* NameOfClass) {
        InterfaceKlasse* newObject = new NameOfClass;
    }
    

    Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...

    Besser so?



  • eine map die namen auf create funktionen mapped. jetzt fuere jede abgeleitete klasse nur noch ein eintrag in der map hinzugefuegt werden. das geht ueber globale objekte recht simpel.



  • Eine imo einfachere Möglichkeit ist mit Templates zu arbeiten

    template <class T>
    InterfaceKlasse* bar()
    {
        InterfaceKlasse* newObject = new T;
        return newObject;
    }
    

    Und je nachdem was du brauchst, gibst du beim Aufruf an

    InterfaceKlasse* newObject = bar<A>();
    

    btw:
    Schreibe bitte

    virtual void foo() = 0;
    

    NULL ist für Zeigerkontext vorgesehen, der hier aber nicht vorliegt.



  • Ist NULL nicht sowieso obsolete? Weil NULL==0, oder? Ich benutze nur 0, ist das schlimm?



  • #define NULL 0;
    


  • ness schrieb:

    Ist NULL nicht sowieso obsolete? Weil NULL==0, oder? Ich benutze nur 0, ist das schlimm?

    Ne, ist gut so.
    NULL ist in C++ wirklich obsolete. Wobei ja ein nullptr oder aehnliches fuer NULL Zeiger im gespraech ist (oder schon angenommen/abgelehnt - ich verfolge die standardisierung nicht wirklich).


Anmelden zum Antworten