Problem mit einer Klasse / Konstruktor

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit einer Klasse / Konstruktor

    Hallo.
    Leider ist es mir nicht möglich den nachfolgenden Code richtig zu interpretieren

    Quellcode

    1. class XYZ
    2. {
    3. public:
    4. XYZ(int eins, int zwei) : eins(eins)
    5. {
    6. this->zwei = zwei;
    7. }
    8. private:
    9. int eins, zwei;
    10. };

    Die Frage zu diesem Code ist:
    Werden die Datenelemente "eins" und "zwei" der Klasse XYZ mit dem angegebenen Konstruktor korrekt initialisiert (mit Begründung!)?

    Leider habe ich keinen blassen Schimmer, was dieser : beim Konstruktor zu bedeuten hat und für was dann der Teil danach steht :?:

    Hoffe ihr könnt mir weiterhelfen :wink:
    ~ rock on ~
  • Das ist eine halbe Vererbung. Das sollte eigentlich nicht funktionieren.
    Mit ": eins(eins)" rufst du den Konstuktor der Klasse eins mit dem Wert eins auf.

    Hast du überhaupt vor von der Klasse1 zu erben? Wenn ja, dann musst du das noch explizit tun.

    Quellcode

    1. class XYZ : public eins
    2. {


    In dem Fall würde ich dich aber fragen warum du den Klasssennamen klein schreibst. Also am besten sag uns einfach was du vorhast,

    Zur Vererbung in C++ siehe folgende Literatur:
    * http://www.willemer.de/informatik/cpp/cpperben.htm
  • Tja, ich kann leider nicht mehr dazu sagen, als ich angegeben hab. Ist eine "Wissensfrage" die mir in meinem Kurs gestellt wurde vom Prof.

    Aber man kann also sicher sagen, dass die Elemente "eins" und "zwei" nicht korrekt initialisiert werden, da man ja nicht weiß, wie der Konstruktor der eventuell (nicht korrekt) vererbeten Klasse aussieht.
    ~ rock on ~
  • @d0nUt es handelt sich hierbei nicht um eine Vererbung.


    XYZ(int eins, int zwei) : eins(eins)
    {
    this->zwei = zwei;
    }

    Das hier ist der Konstuktor der Klasse und diese schreibweise : eins(eins)
    ist die initalisierung von eins, fällt unter den Begriff Teilobjekt. Und es Funktioniert auch richtig, es ist korrekt. Nur ists keine schöne Schreibweise, Teilobjekte nutze ich eigentlich auch eher selten.
  • class PKW
    {
    ...
    public:
    PKW(int snr)
    {
    ...
    }

    ...
    };


    class Golf : public PKW
    {
    ...
    public:
    Golf(int x, int y) : PKW(x)
    {
    ..
    }
    ...
    };

    hierbei wird der Konstruktor der Basisklasse PKW beim aufruf des Ctr's der Klasse Golf mit aufgerufen. Beim anderen Fall steht aber kein Konstruktor nach dem : sondern eine Variable, die als sog. Teilobjekt gesehen wird. Beim Beispiel vom themenstarter wird die Variable "intialisiert" (stimmt nicht ganz bei Teilobjekten wirds erst mit eine Default-wert initialisiert und dann, ist perf. nicht ganz so gut), da sie aber kein objekt ist, nennt man es eben Teilobjekt, da die schreibweise ziemlich ähnlich der anderen ist.
  • Ja find ich auch, Java war auch meine erste Sprache.
    Und ich muss ehrlich sagen ein Java-Code schaut bei weitem
    übersichtlicher aus als ein C++ Code. Aber ich mag C/C++
    wegen seiner Mächtigkeit in die Hardware rein zu gehen,
    und ich bin ein großer Fan von Pointern, auch wenn der Code dann nicht
    mehr so schön aussieht wie bei Java.
  • Ich hab nie mit Pointern unter Java gearbeitet.
    Aber ich bin relativ schnell zu C/C++ geschwenkt weil ich wusste
    das mich der Embedded Systems Bereich am meisten interessiert,
    und das ich dort nachm Studium arbeiten will. Ja C ist dort die Nr. 1.
    Ich arbeite auch nebenbei in ner Firma die So intelligente Kameras
    herstellt die Chips drauf werden alle in C geschrieben.

    und das mitm OOP stimmt, in Java kommst Du nicht drum rum.
    Bei C++ kannst die Sprache ja entarten und in C schreiben :D

    Wobei ich Java auch nciht komplett vernachlässige. Aber große
    Projekte mach ich nicht mehr mit Java.
  • Man arbeitet nur passiv mit Pointer. Wenn ich z.B. ne Liste anlege (new LinkedList<String>()) und diese einer Methode übergebe und dort Objekte hinzufüge, dann brauche ich die Liste nicht zurückgeben um in der Ursprungsmethode auf die neuen Objekte zuzugreifen zu können. Das kommt daher, das die Liste nicht kopiert wird, sondern lediglich der Pointer übergeben wird. Bei int, char aber auch String oder Integer ist es anders. Hier wird das Objekt kopiert. Wovon das abhängt weiß ich leider nicht genau, ist eigentlich ne Wissenslücke von mir.
  • Du solltest dir mal unter c-plusplus.de/forum ein paar C++ <-> Java Föamewars geben :D

    unter java schafft man eine NullPointerException genauso schnell wie einen SegmentationFault unter C++
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • "Hafner" schrieb:

    Bei int, char aber auch String oder Integer ist es anders. Hier wird das Objekt kopiert. Wovon das abhängt weiß ich leider nicht genau, ist eigentlich ne Wissenslücke von mir.

    Pauschal werden alle Objekte als Referenz übergeben.
    Die Wrapperklassen um die 8 Grundprimitive bilden da eine Ausnahme, weil sie als immutable deklariert sind. So werden sie zwar auch als Referenz übergeben, aber ihr Wert lässt sich innerhalb der Funktion nicht ändern.