Interface - Schnittstellen, Basisklassen?



  • Hallo, ich möchte folgendes verwirklichen:

    //**********************************************
    
    class KlassenBasis{
    };
    
    class Klasse1:public KlassenBasis {
    	// spezieller code...
    };
    
    class Klasse2:public KlassenBasis {
    	// spezieller code...
    };
    
    class Klasse2:public KlassenBasis {
    	// spezieller code...
    };
    
    classe Test{
    
    public:
    
    	KlassenBasis	*meineklasse;
    
    	Klasse1	*Init_Klasse1() {
    		meineklasse = new Klasse1;
    		return meineklasse;
    	}
    
    	Klasse2	*Init_Klasse2() {
    		meineklasse = new Klasse2;
    		return meineklasse;
    	}
    
    	Klasse3	*Init_Klasse3() {
    		meineklasse = new Klasse3;
    		return meineklasse;
    	}
    };
    
    //**********************************************
    

    Wie man unschwer erkennen kann ist mir vc++ 6.0 so ziemlich neu, aber irgendwann muß man ja mal anfangen *g*.

    Die Idee ist, das die Variable meineklasse, je nach Aufruf der verschiedenen Init_... Methoden mit der entsprechenden Klasse initialisiert wird.
    Leider funktioniert das nicht so wie ich mir das vorgestellt habe.
    Ich habe mich da an die "interface - implements" Design von VB6 orientiert.
    Vielleicht kann mir da wer weiterhelfen.

    Danke!!!

    mfg Threedee 😕

    --
    edit: codetags [m++]



  • wenn du es genauso machst, wie in deinem beispiel beschreiben, musst du
    return static_cast<KlasseX*> (meineklasse);
    schreiben. 🙄
    aber vielleicht solltest du mal konkreter werden und auch sagen, was nicht funktioniert, bzw. welche fehler?

    /edit: sry, static_cast reicht



  • und du solltest nicht vergessen den Speicher wieder freizugeben

    btw. hat das nichts mit vc++6 zu tun, sondern ist ein C++ Problem (du postest das ja auch im C++ und nicht im CV++ Forum 🙄 )



  • Hallo, danke für die schnellen Antworten!!

    Das mit dem Speicher ist mir klar ;), o.g. sollte auch nur ein (sehr) schnelles Beispiel zur Verdeutlichung des Problems sein.

    Die Sache mit "static_cast" geht leider nicht: "class KlassenBasis *' kann nicht in 'class Klasse1' konvertiert werden"

    Auch, wenn ich von außerhalb auf die Varibale "meineklasse" zugreife, hat sie immer nur die Eigenschaften der "KlassenBasis", aber nie die der zugewiesenen Klassen.

    Gibt es da einen anderen Weg das zu realisieren oder denke ich da nur falsch?



  • Hier ist mal der komplette code des Testprogramms:

    class KlassenBasis{
    };

    class Klasse1:public KlassenBasis {
    // spezieller code...
    char *Test1() {
    return "test1";
    }
    };

    class Klasse2:public KlassenBasis {
    // spezieller code...
    char *Test2() {
    return "test2";
    }
    };

    class Klasse3:public KlassenBasis {
    // spezieller code...
    char *Test3() {
    return "test3";
    }
    };

    class Test{

    public:

    KlassenBasis *meineklasse;

    KlassenBasis *Init_Klasse1() {
    meineklasse = new Klasse1;
    return meineklasse;
    }

    KlassenBasis *Init_Klasse2() {
    meineklasse = new Klasse2;
    return meineklasse;
    }

    KlassenBasis *Init_Klasse3() {
    meineklasse = new Klasse3;
    return meineklasse;
    }
    };

    void test() {

    Test testclass;

    testclass.Init_Klasse1();
    testclass.meineklasse->Test1;

    testclass.Init_Klasse2();
    testclass.meineklasse->Test2;

    testclass.Init_Klasse3();
    testclass.meineklasse->Test3;

    };

    Fehler: error C2039: 'Test1' : Ist kein Element von 'KlassenBasis'

    der Fehler ist klar, aber wie kann ich das realisieren das "meineklasse" die verschiedenen eigenschaften der jeweiligen zugewiesene klasse hat???

    ciao



  • Das kann so nicht gehen (mal von den Syntaxfehlern abgesehen): Was würde denn passieren, wenn man InitKlasse1 und dann Test2 aufruft etc.? Dein Problem musst du wohl anders lösen. Worum geht es denn etwas konkreter?



  • vielleicht solltest du nochmal darüber nachdenken was
    ein Interface in C++ ist und was eine Basisklasse ist.
    Ein Lösungsansatz können virtuelle Funktion sein.



  • Ich nahm an das die Interface-Implementation in VB auf ähnliche weise in C++ gehandhabt werden könnte.... hab wohl falsch gedacht...



  • Leider ist der Unterschied in C++ zwischen Interface und
    Basisklasse kaum bzw. gar nicht in der Realisierung vorhanden.

    Wenn ich dein Beispiel richtig verstehe könnte man
    z.B. so anfangen:

    class IKlasseInterface 
    { 
    public: 
    virtual ~IKlasseInterface(){} //freigabe solltest du mal ohne 
                                  //versuchen  :clown: 
    virtual bool init()=0; 
    virtual char* test()=0; 
    }; 
    
    class KlassenBasis:pulic IKlassenInterface 
    { 
    private: 
    //member Varibalen 
    public: 
    // mehr Funktionen 
    }; 
    
    class Klasse1:public KlassenBasis 
    { 
    public: 
    virtual bool init() 
    { 
      return m_bAllesOk; 
    } 
    virtual char* test() 
    { 
      return m_szText; 
    } 
    }; 
    
    class Test 
    { 
    private: 
    IKlassenInterface *pI; 
    
    public: 
    bool iniKlasse1() 
    { 
      pI=new Klasse1; 
      return pI->init(); 
    } 
    char* testKlasse1() 
    { 
      if(pI) retrun pI->test(); 
    } 
    // oder 
    Klasse1* getKlasse1() 
    { 
      if(pI) 
       return static_cast<Klasse1*>(pI); 
      else 
       return NULL; 
    } 
    };
    

    Was fehlt ist, ob pI tatsächlich auf Klasse1/2/3 zeigt und
    wie erwäht die Freigabe.
    Vielleicht wird deutlich das Basisklassen und Interfaces zwar gleich
    realisiert werden aber unterschiedliche Denkmodellen folgen. Somit
    ist der Unterschied eigentlich "nur" eine Definition der Realisierung.
    Interfaces können nicht instanziert werden usw. blabla ... etc p.p.



  • Danke, das hilft mir weiter!!!!

    mfg Threedee



  • Wirklich??

    Zugegeben es war wohl etwas zügig erklärt. Ich habe mich
    an deine Überschrift gehalten und nur daran errinnern wollen
    das ein Interface Teil eines Objektes ist. Naja, und
    eine Basisklasse der Beginn einer OO-Hierachie.
    Ich habe eine leichte Ahnung was du willst, aber ohne
    Konkretisierung dreh man sich 'n Wolf.
    Hast dir zu Beginn ein schwierigs Thema ausgedacht.



  • Ich programmiere doch schon einige Jahre, aber OO in C++ halt erst seit kurzem, vorher nur OO in VB6 (wenn man das OO nennen darf *g*)

    Dank deines Entwurfs steige ich da jetzt durch, und ich muß sagen das das jetzt ganz gut klappt.

    mfg Threedee


Anmelden zum Antworten