Objekt einer Klasse in ein anderes Objekt übertragen



  • Moin!

    folgendes Problem:

    ich habe ein Objekt, das am Anfang des Codes einer Klasse zugewiesen wird.
    Ich habe vier ähnliche Objekte, die aber vier unterschiedlichen Klassen zugewiesen werden.
    Von diesen Objekten mag ich am Ende nur Eines benutzen und mache daher eine Abfrage, wo geklärt wird, welches. Das geht über eine Selection Box, die mir eine Variable des Typs long zurückgibt. Jetzt will ich eben abhängig von der Selection Box von hier an nur noch mit dem Objekt, das benutzt werden soll, arbeiten. Da dieses Objekt für verschiedene Berechnungen noch oft aufgerufen wird im weiteren Verlauf, hatte ich mir gedacht, eine case-Abfrage zu machen, in der die Variable der Selection box variiert wird, um dann ein neues Objekt zu erschaffen, das quasi die gleichen Eigenschaften und Klassenzugehörigkeit besitzt wie das, das ich benutzen will.
    Leider übersteigt das dann doch mein gefährliches Halbwissen von C++ und ich produziere beim Kompilieren immer wieder andere Fehler ohne Erfolg.

    static Classone   Objectone;
    static Classtwo   Objecttwo;
    static Classthree Objectthree;
    static Classfour  Objectfour;
    .
    .
    .
    objectone.setinfo1   ();
    objectone.setinfo2   ();
    .
    .
    objectone.setinfo_n  ();
    .
    .
    objectfour.setinfo_n ();
    .
    .
    .
    switch (selection_box)
    {
    case value0: furtherTBU = objectone; break;
    case value1: furtherTBU = objecttwo; break;
    case value2: furtherTBU = objectthree; break;
    case value3: furtherTBU = objectfour; break;
    }
    .
    .
    .
    calculation= furtherTBU.getinfo1()+200;
    

    Das bedeutet, dass dieses "Ding" furtherTBU (TBU für to be used) an Stelle eines Objektes mit allen seinen Eigenschaften treten soll. Ich weiß leider nicht, wie furtherTBU gewählt sein muss, um das zu können.
    Ich kann seine Klasse ja erst zuweisen, nachdem die SelectionBox generiert und abgefragt wurde. Da dieser Teil aber schon spät im Code steht ist das kompliziert und für mich nicht lösbar.
    Habe nach vielem Lesen mit Zeigern usw. und vielem Probieren kapituliert und würde mich daher freuen, wenn sich hier jemand meines (für mich sehr wichtigen) Problems annehmen würde.

    Bin für Alles dankbar!



  • mit einer virtuellen methode !

    class objectbase
    {
    public:
        virtual int getinfo1() = 0; // rückgabewert anpassen
    };
    class Classone : public objectbase
    {
        //...
    };
    class Classtwo: public objectbase
    {
        //...
    };
    // alle anderen klassen erben auch von objectbase
    // 
    static Classone   Objectone;
    static Classtwo   Objecttwo;
    static Classthree Objectthree;
    static Classfour  Objectfour;
    .
    .
    .
    objectone.setinfo1   ();
    objectone.setinfo2   ();
    .
    .
    objectone.setinfo_n  ();
    .
    .
    objectfour.setinfo_n ();
    .
    .
    
    objectbase *temp = 0;
    switch (selection_box)
    {
    case value0: temp = &objectone; break;
    case value1: temp = &objecttwo; break;
    case value2: temp = &objectthree; break;
    case value3: temp = &objectfour; break;
    }
    objectbase &furtherTBU = *temp;
    .
    .
    calculation= furtherTBU->getinfo1()+200;
    


  • django28 schrieb:

    ich habe ein Objekt, das am Anfang des Codes einer Klasse zugewiesen wird. Ich habe vier ähnliche Objekte, die aber vier unterschiedlichen Klassen zugewiesen werden.

    Ich verstehe dein Design zwar nicht, aber das was du suchts dürfte Polymorphie sein. Sprich eine Basisklasse in der die Schnittstelle definiert ist, und die anderen Klassen sind von dieser Abgeleitet.

    Polymorphie funktioniert aber nur mit Zeigern oder Referenzen (Auf die Basisklasse).

    cu André



  • helferlein schrieb:

    mit einer virtuellen methode !

    Danke erstmal! Problem ist, dass es nicht nur eine methode "getinfo1()" gibt, sondern viele andere, die auf die Objekte (Objectone, Objecttwo) zurückgreifen. Diese Methoden sind aber vordefiniert und können von mir nicht in eine virtuelle Methode eingebaut werden, weil ich gar nicht weiß, was da brechnet wird.
    Davon abgesehen sind die Methoden (get*()) ja erst mal drauf angewiesen, dass Werte gesetzt wurden (set*()=x).

    Kann man furtherTBU nicht einfach als irgendetwas deklarieren, was man aussehen lassen kann, wie eines dieser Objekte?
    WIe mit

    if (b)
    {
    a=1;
    }
    

    Nur eben statt mit nem Integer, mit einem Objekt.
    😞
    Thx



  • Ich weiß ja, dass ich dazu neige, mich so auszudrücken, dass keiner versteht, was ich will. Um es einfach zu machen, hier noch ein einfaches Beispiel aus einem Tutorial:

    #include <iostream>
    #include <stdlib.h>
    
    class Vehikel
    {
    protected:
       int Raeder;
       double Gewicht;
    public:
       void Initialisiere(int EinRaeder, double EinGewicht);
       int HoleRaeder(void)       {return Raeder;}
       double HoleGewicht(void)	{return Gewicht;}
       double Radlast(void)       {return Gewicht/Raeder;}
    };
    
    class Auto : public Vehikel
    {
       int Passagieranzahl;
    public:
       void Initialisiere(int EinRaeder, double EinGewicht, int Leute = 4);
       int Passagiere(void)       {return Passagieranzahl;}
    };
    
    class Laster : public Vehikel
    {
       int Passagieranzahl;
       double Ladung;
    public:
       void InitLaster(int WieViele = 2, double MaxLadung = 10000.0);
       double Effizienz(void);
       int Passagiere(void)       {return Passagieranzahl;}
    };
    
    int main()
    {
    Vehikel Hochrad;
    
       Hochrad.Initialisiere(1, 5.7);
       std::cout << "Das Hochrad hat " <<
    					  Hochrad.HoleRaeder() << " Rad.\n";
       std::cout << "Die Radlast des Hochrades betraegt " <<
    	   Hochrad.Radlast() << " kg auf dem einzigen Rad.\n";
       std::cout << "Das Hochrad wiegt " <<
    				     Hochrad.HoleGewicht() << " kg.\n\n";
    
    Auto Sedan[3];
    int Index;
    
       for (Index = 0 ; Index < 3 ; Index++)
       {
    	Sedan[Index].Initialisiere(4, 1600.0, 5);
    	std::cout << "Der Sedan fuehrt " << Sedan[Index].Passagiere() <<
    							" Passagiere mit sich.\n";
    	std::cout << "Der Sedan wiegt " <<
    				     Sedan[Index].HoleGewicht() << " kg.\n";
    	std::cout << "Die Radlast des Sedan ist " <<
    					Sedan[Index].Radlast() <<
    								 " kg pro Rad.\n\n";
       }
    
    Laster *Sattelschlepper;
    
       Sattelschlepper = new Laster;
       if (Sattelschlepper == NULL)
       {
    	std::cout << "Speicherbeschaffung fehlgeschlagen\n";
    	exit (EXIT_FAILURE);
       }
       Sattelschlepper->Initialisiere(18, 5700.0);
       Sattelschlepper->InitLaster(1, 15300.0);
       std::cout << "Der Sattelschlepper wiegt " << Sattelschlepper->HoleGewicht() << " kg.\n";
       std::cout << "Die Effizienz des Sattelschleppers ist " <<
    			  100.0 * Sattelschlepper->Effizienz() << " Prozent.\n";
       delete Sattelschlepper;
    
       return 0;
    }
    

    Was ich jetzt im Endeffekt will, ist die Methode 'Hochrad' später umzubenennen (sagen wir mal in 'HohesRad', wobei ich trotzdem noch die mit Hochrad assoziierten Funktionen nutzen will. Das bedeutet, es muss später HohesRad.HoleRaeder() benutzt werden können.
    Ist jetzt klarer, was ich meine?
    Geht das irgendwie "einfach"?


Anmelden zum Antworten