Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 28 von 28

Thema: C++ und "virtual"

  1. #16
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Wenn ich jetzt eine Sub-Klasse erstelle und die abstrakten Methode "erstellt" und auch einen Constructor wo ich neben dem Namen noch weiter Sachen übergeben muss, dann kann ich leider nicht den Konstruktor von "Mitarbeiter" aufrufen,...
    Doch, das geht.

    Code:
    class A
    {
    public:
    A(int x) : m(x) { }
    virtual void f() = 0;
    };
    
    class B : public A
    {
    public:
    B() : A(10) { }
    virtual void f() { }
    };
    Sowas meintest du doch, oder?

  2. #17
    K@sperl
    Gast
    Zitat Zitat von Silver
    Gibts in C++ so etwas ähnliches wie super in Java?!?
    Ja, bei der Deklaration des constructors mach folgendes:

    Code:
    public:
      myClass(int i) :base(i) { 
        ...
      }
    Mit base() rufst du den constructor der Basisklasse auf und übergibst ihm einen bel. Parameter.


    edit: @locus vivendi
    Du bist wohl ein bißchen schneller gewesen
    Geändert von K@sperl (13-07-2004 um 22:13 Uhr)

  3. #18
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Code:
    class Foo {
    public:
       Foo( int i ) { ... }
    };
    
    class Bar : public Foo {
    public:
       Bar() : Foo( 5 ) { ... }
    };
    Genügt die "Erklärung"?

    Edit:
    Hups, da gab's ja ne 2. Seite...
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  4. #19
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    macht es eigentlich einen Unterschied ob ich z.B so initialisieren
    Code:
    methode(char* _name, int _alter):name(_name),alter(_alter) { }
    oder so
    Code:
    methode(char* _name, int _alter) { name=_name; alter=_alter; }
    Ist das nur eine andere Syntax?!?`

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  5. #20
    K@sperl
    Gast
    Nein, das macht keinen Unterschied, es ist nur eine andere Schreibweise.
    Du kannst aber anstatt mit _name einen unterschiedlichen Var.namen zu verwenden, das mit this machen, z.B.
    Code:
    methode(char* name, int alter) {
      this.name = name;
      this.alter = alter;
    }
    edit: Wobei es nicht wirklich geschickt ist, einem char* einen anderen zuzuweisen, da nicht der Wert kopiert wird sondern beide Var. auf den selben Speicherbereich zeigen. Besser wär es string zu verwenden oder mit strcpy() den Inhalt der char* Variable zu kopieren.

    Mit this spricht du die Komponenten dieser Klasse an, die du vorher deklariert hast.
    Geändert von K@sperl (14-07-2004 um 10:36 Uhr)

  6. #21
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Es besteht mehr als nur ein syntaktischer Unterschied, aber klar wird es erst, wenn du die Ebene nativer Typen (int,char,...) verlässt.

    Nimm statt char* mal std::string an, dann wird in deinem ersten Codebeispiel der Copyconstructor aufgerufen.
    In deinem zweiten Beispiel aber zuerst der Standardkonstruktor (falls vorhanden, sonst gibt es bereits Kompilerfehler), und dann wird der Zuweisungsoperator aufgerufen.
    Du hast hier als zwei Operationen statt nur einer.

    Im Falle nativer Typen sieht es etwas anders aus, weil der Standardkonstruktor nur generiert wird, wenn er von der Implementierung benötigt wird, das ist bei int,char... usw nicht der Fall.

    Also benutze immer die Initialisierungsliste, es schadet nie, und hilft oft.

  7. #22
    Registrierter Benutzer
    Registriert seit
    11.07.2004
    Beiträge
    8
    Außerdem kann's ja sein, dass der Member gar keinen Default-Constructor hat, dann musst du die Initialisierungsliste verwenden.

  8. #23
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Zitat Zitat von Ringding
    Außerdem kann's ja sein, dass der Member gar keinen Default-Constructor hat, dann musst du die Initialisierungsliste verwenden.
    wenn man keinen Constructor selbst definiert hat, erstellt der Compiler dann nicht selbst einen?!? Zum. ist das in Java so!
    Für was gibts eigentlich einen Kopierconstructor?!

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  9. #24
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von Silver
    wenn man keinen Constructor selbst definiert hat, erstellt der Compiler dann nicht selbst einen?!? Zum. ist das in Java so!
    Ja, es ist genau wie in Java.
    Und das heißt, wenn man einen Defaultconstructor deklariert hat, dann wird dieser vom Compiler benutzt.
    Ansonsten wird einer vom Compiler generiert, es sei denn es wurde ein anderer Constructor (mit Parametern) deklariert (oder man hat den Defaultconstructor private/protected deklariert).
    Also selbes Verhalten wie in Java.
    Für was gibts eigentlich einen Kopierconstructor?!
    Der vom Compiler generierte Copy-Constructor macht nur eine flache Kopie, daher muß man in den Fällen, wo das nicht ausreichend ist selber den Copy-Constructor implementieren, und eine tiefe Kopie anfertigen.

  10. #25
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Außerdem ist die Initialisierungsliste die einzige Möglichkeit konstante Members zu initialisieren, weil es eben eine Initialisierung ist und keine Zuweisung, die ja bei einer Konstanten vom Compiler nicht erlaubt wird.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #26
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Silver
    Im Prinzip check ich alle grundlegenden Sachen in C++, no na hab auch 1 Jahr bis jetzt Java geproggt, aber das mit den abstrakten Methoden.... dass ich da kein Objekt draus erstellen kann und Java "irgendwie" doch:
    Man kann auch in Java keine Instanz einer abstrakten Klasse erzeugen.

    Eine abstrakte Klasse ist ja per Definition noch nicht fertig definiert, hellsehen kann der Compiler nicht

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  12. #27
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Man kann auch folgendes schreiben (funkt. zumindest mit g++ und msvcpp):
    Code:
    class Foo {
    private:
       int i;
       string str;
    
    public:
       Foo( int i, string str ) : i( i ), str( str ) {}
    };
    Sprich Parameter und Member gleich benennen und trotzdem funktioniert die Initialisierung einwndfrei, ist an der Stelle ja eindeutig, kann ja nicht der Parameter gemeint sein.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  13. #28
    Registrierter Benutzer
    Registriert seit
    11.07.2004
    Beiträge
    8
    Zitat Zitat von anda_skoa
    Außerdem ist die Initialisierungsliste die einzige Möglichkeit konstante Members zu initialisieren, weil es eben eine Initialisierung ist und keine Zuweisung, die ja bei einer Konstanten vom Compiler nicht erlaubt wird.

    Ciao,
    _
    Ahja, genau. Für Referenzen gilt das gleiche.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •