implements?



  • wenn aber die erbende klasse mehr methoden/ variable hat als die vererbende (virtuelle) macht dann der pointer nicht zu wenig platz frei?

    och man wie beknackt ist das denn 😞

    wenn ich folgendes mache:

    class a
    {
    public:
       foo();
    };
    
    class b : public a
    {
    public:
       foo();
       bar();
    };
    
    a* obj = new b();
    obj->bar();
    

    dann krieg ich nen fehler Oo
    wie soll ich denn das machen?



  • hola

    pixartist schrieb:

    wenn aber die erbende klasse mehr methoden/ variable hat als die vererbende (virtuelle) macht dann der pointer nicht zu wenig platz frei?

    etwas ungluecklich ausgedrueckt. delete gibt den speicher frei.
    Nachdem du aber mit

    MyInterface *mi1 = new MyImplementation_a();
    

    speichergeholt hast, weiß delete das es speicher fuer 'MyImplementation_a' wieder freigeben muss.

    Meep Meep



  • pixartist schrieb:

    och man wie beknackt ist das denn 😞

    wenn ich folgendes mache:

    class a
    {
    public:
       foo();
    };
    
    class b : public a
    {
    public:
       foo();
       bar();
    };
    
    a* obj = new b();
    obj->bar();
    

    dann krieg ich nen fehler Oo
    wie soll ich denn das machen?

    obj wieder auf b casten. du greifst über nen pointer vom typ a drauf zu und a kennt die methode bar nicht. da c++ aber weder sowas wie instanceof noch reflection kennt, muss man sich bei solchen sachen halt was ausdenken. vielleicht nen enum mit dem typ der klasse im "interface" mitschleppen.



  • Krux schrieb:

    nicht ganz, ich kann beispielsweise nicht den operator % für flieskommatypen überschreiben. Aber das hiest nicht, dass man bei der Java denkweise bleiben sollte.

    Was hat das damit zu tun?!



  • Konrad Rudolph schrieb:

    Krux schrieb:

    nicht ganz, ich kann beispielsweise nicht den operator % für flieskommatypen überschreiben. Aber das hiest nicht, dass man bei der Java denkweise bleiben sollte.

    Was hat das damit zu tun?!

    c++ erlaubt es nicht, operatoren für primitive typen zu überschreiben. (es ging um den unterschied zwischen primitiven und eigenen typen)



  • thordk schrieb:

    pixartist schrieb:

    och man wie beknackt ist das denn 😞

    wenn ich folgendes mache:

    class a
    {
    public:
       foo();
    };
    
    class b : public a
    {
    public:
       foo();
       bar();
    };
    
    a* obj = new b();
    obj->bar();
    

    dann krieg ich nen fehler Oo
    wie soll ich denn das machen?

    obj wieder auf b casten. du greifst über nen pointer vom typ a drauf zu und a kennt die methode bar nicht. da c++ aber weder sowas wie instanceof noch reflection kennt, muss man sich bei solchen sachen halt was ausdenken. vielleicht nen enum mit dem typ der klasse im "interface" mitschleppen.

    kannst du mir daq n beispiel geben ?

    würde das gehen:

    ((b*)obj)->bar();
    

    ?



  • pixartist schrieb:

    würde das gehen:

    ((b*)obj)->bar();
    

    ?

    Merke: C-Casts in C++ stinken. Verwende 'static_cast' oder 'dynamic_cast' (letzteres nur, wenn Du nicht weißt, welchen Typ das Objekt hat).



  • du musst alle methoden, die du über einen pointer auf eine Klasse erreichbar haben möchtest auch in dieser bereitspellen, das ist auch in Java nicht anders, und da den cast den du da vorgeschlagen hast, vergess den schnell wieder, das ist müll. wenn du sowiso weist, was für ein datentyp das ist, und du auch alle methoden dieses Datentyps nutzen möchtest, dann verwende gleich eine Variable von genau dem typ, und nicht von der superklasse.



  • Krux schrieb:

    du musst alle methoden, die du über einen pointer auf eine Klasse erreichbar haben möchtest auch in dieser bereitspellen, das ist auch in Java nicht anders, und da den cast den du da vorgeschlagen hast, vergess den schnell wieder, das ist müll. wenn du sowiso weist, was für ein datentyp das ist, und du auch alle methoden dieses Datentyps nutzen möchtest, dann verwende gleich eine Variable von genau dem typ, und nicht von der superklasse.

    1. java kennt keine pointer
    2. bei java hat eine variable einen statischen und einen variablen typ, man kann auf alle methoden des dynamischen typs zugreifen.



  • class a
    {
    public:
       foo();
    };
    
    class b : public a
    {
    public:
       foo();
       bar();
    };
    

    wieso geht hier denn folgendes nicht?

    b obj;
    

    ?



  • pixartist schrieb:

    1. java kennt keine pointer
    2. bei java hat eine variable einen statischen und einen variablen typ, man kann auf alle methoden des dynamischen typs zugreifen.

    Beides Quatsch. Java nennt Zeiger lediglich Referenzen und die zweite Aussage ist einfach nur komisch.

    pixartist schrieb:

    wieso geht hier denn folgendes nicht?

    b obj;
    

    ?

    Weil die Klassendeklarationen falsch sind. Die Funktionen brauchen Rückgabetypen.

    /EDIT: Oh, hatte "Teil" statt "Typ" gelesen. Na gut, dann ergibt die zweite Aussage natürlich trotzdem Sinn. Aber für C++ gilt dasselbe (zumindest für Zeiger und Referenzen)!



  • Konrad Rudolph schrieb:

    pixartist schrieb:

    wieso geht hier denn folgendes nicht?

    b obj;
    

    ?

    Weil die Klassendeklarationen falsch sind. Die Funktionen brauchen Rückgabetypen.

    hä wie? versteh ich ned



  • class A
    {
      public:
      void foo();
    };
    
    int main() {
      A a;
    }
    

    wenn man sowas durch den compiler jagt, meckert er, dass A incomplete sei (die implementierung von foo fehlt). und da du nur "geht nicht" geschrieben hast, war das wohl seine vermutung, was der fehler sein könnte.



  • thordk schrieb:

    wenn man sowas durch den compiler jagt, meckert er, dass A incomplete sei (die implementierung von foo fehlt).

    Nö, wieso sollte er. Hier meckert höchstens der Linker.

    @pixartist:
    Auch in Java darf es keine Funktionen geben, die nichts zurückgeben, oder? Dasselbe gilt in C++.
    (z.B. wäre "public Test()" nur gültig wenn die Klasse "Test" heisst.)



  • thordk schrieb:

    wenn man sowas durch den compiler jagt, meckert er, dass A incomplete sei (die implementierung von foo fehlt).

    Über den Code beschwert sich der Compiler überhaupt nicht (der geht davon aus, daß die Methodendefinition schon irgendwo existieren wird) - darüber beschwert sich höchstens der Linker, wenn er die Definition nicht findet.

    Der Compiler beschwert sich höchstens über incomplete Typen, wenn du eine Variable anhand einer Forward-Deklaration anlegen willst:

    class A;
    
    A obj;
    


  • argh nein sry ihr habt mich falsch verstanden

    class a 
    { 
    public: 
       virtual foo() = 0; 
    }; 
    
    class b : public a 
    { 
    public: 
       foo(); 
       bar(); 
    }; 
    
    b::foo()
    {
    //bla
    }
    b::bar()
    {
    //blub
    }
    
    b test; //hier meckert der bei mir
    

    error C2259: "b" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
    Siehe Deklaration von 'b'



  • Das ändert nix daran, dass der Code falsch ist. Du musst die Funktionen nach wie vor mit einem Rückgabetyp deklarieren!



  • jaja, der linker ihr korinthenkacker :p



  • pixartist schrieb:

    argh nein sry ihr habt mich falsch verstanden

    class a 
    { 
    public: 
       virtual void foo() = 0; 
    }; 
    
    class b : public a 
    { 
    public: 
       void foo(); 
       void bar(); 
    }; 
    
    void b::foo()
    {
    //bla
    }
    void b::bar()
    {
    //blub
    }
    
    b test; //hier meckert der bei mir
    

    error C2259: "b" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
    Siehe Deklaration von 'b'

    edit: ups...das hab ich glatt vergessen. die funktionen haben rückgabetype 😕



  • Und welches Element vermisst der Compiler da?


Anmelden zum Antworten