Klassen erzeugen



  • 1. mit 'new' erzeugst du keine klasse sonder z.b. ein objekt

    2. mueller ist keine variable sondern ein objekt



  • das mit dem kosntuktor liegt ja nicht an new... mit new reservierst du nur dynamisch speicher...

    du musst mehrere "versionen" vom konstruktor schreiben....
    eine mit keinem parameter und dann die adneren mit parametern oder du machst es mit default-parametern...

    wenn du nämlich den konstruktor weglkässt, dann erzeugt der compiler selber eine "sparversion" von dem konstruktor... doch dieser konstruktor macht dann nichts..



  • Hallo,
    danke für eure antworten.
    Ich hab den "Fehler" gefunden und schäme mich nun ganz arg hihi;-)
    Ich hab zwar einen Konstruktor deklariert im Header ,abber nicht implemmentiert in der cpp. Datei. Toll!! Das kann ja nicht klappen. Soviel dazu.
    Ein Teil meiner Frage war auch, in welchen Fällen man Klassen man mit "new" erzeugt und wann nicht. Brauch ich immer einen Zeiger auf die Klasse? Dann würde ich mit "new" erzeugen. Wenn ich aber keinen Zeiger brauche, ist das doch nicht nötig,oder? Ich könnte doch auch später noch einen Zeiger auf die Klasse setzen, ohne das ich mit "new" erzeugt habe. Seh ich das im richtigen Zusammenhang?
    Danke euch 🙂

    paloncino



  • ich glaube, dass du das mit den zeigern und new noch nicht so richtig verstanden hast.... das solltest du ggf. nochmal im buch/tutorial nachlesen...



  • OMG, was teht denn hier drin... 🙄

    leech schrieb:

    ich glaube, dass du das mit den zeigern und new noch nicht so richtig verstanden hast.... das solltest du ggf. nochmal im buch/tutorial nachlesen...

    Was denkst du, wieso er fragt?

    Gast221212: Richtig, aber danach hat er gar nicht gefragt. Ich kann auch einen Zeiger ohne new drauf setzen.

    enno-tyrant schrieb:

    1. mit 'new' erzeugst du keine klasse sonder z.b. ein objekt

    Nein, du reservierst Speicher.

    leech schrieb:

    du musst mehrere "versionen" vom konstruktor schreiben....

    Muss ich gar nicht. Ist auch manchmal gar nicht sinnvoll.

    leech schrieb:

    wenn du nämlich den konstruktor weglkässt, dann erzeugt der compiler selber eine "sparversion" von dem konstruktor... doch dieser konstruktor macht dann nichts..

    Man kann den Konstruktor auch private machen.



  • ja, man kann den konstruktor private machen, aber das bringt paloncino im moment nichts... außerdem, wenn man den konstruktor private macht, kann man dann überhaupt noch objekte dieser klasse erzeugen?

    das mit dem konstruktor und den mehreren parametern bezog sich darauf, dass er meinte, dass der konstruktor nicht das macht, was er soll...
    kann aber auch sein, dass ich ihn missverstanden habe...
    er meinte irgendwas vonwegen vor- und nachname...

    also:

    mitarbeiter::mitarbeiter(const string& vorname, const string& nachname)
    {
        this->vorname = vorname;
        this->nachname = nachname;
    }
    

    er wollte ihn dann per:

    mitarbeiter mueller;

    aufrufen, oder nicht?
    und das geht dann ja nicht...



  • leech schrieb:

    außerdem, wenn man den konstruktor private macht, kann man dann überhaupt noch objekte dieser klasse erzeugen?

    über 'ne statische methode geht's dann noch. eventuell über irgendwas mit 'friend' könnt's auch noch gehen.

    leech schrieb:

    das mit dem konstruktor und den mehreren parametern bezog sich darauf, dass er meinte, dass der konstruktor nicht das macht, was er soll...
    kann aber auch sein, dass ich ihn missverstanden habe...
    er meinte irgendwas vonwegen vor- und nachname...

    ich glaub' er will eher den unterschied zwischen heap und lokalen objekten wissen



  • Hier ist eine Erklärung des Unterschieds:
    http://www.kharchi.de/cppratgeber1.htm



  • Hallo paloncino

    also ich bin zwar auch noch nicht so erfahren mit C++ aber ich werd einfach mal versuchen dir zu erläutern wie das mit dem "new" ist.

    Also sagen wir mal du hast eine Klasse Mitarbeiter und du willst jetzt ein Programm schreiben, das drei Objekte der Klasse mitarbeiter bearbeitet,
    dann kannst du ganz normal

    Mitarbeiter Mit1, Mit2, Mit3;

    in deinen Quelltext schreiben und somit mit diesen 3 Objekten arbeiten.
    (Wenn du keinen Default-Konstruktor hast, oder einen Konstuktor mit Defoult-
    Argumenten, musst du halt mit den Werten initialisieren also z.B.: Mit1("Peter", "Mueller"); )
    Wenn du jetzt Zeiger darauf brauchst, dann brauchst du trotzdem kein "new" sondern du machst einfach wie gewohnt

    Mitarbeiter* ptr_Mit1 = &Mit1;

    Stell dir jetzt aber mal vor du schreibst ein Programm und du weist noch garnicht wieviele Mitarbeiter nachher benötigt werden. Also kannst du dann z.B. durch eingabe eines bestimmten Wortes oder was weiss ich ein NEUES Objekt vom Typ deiner Klasse erzeugen, während das Programm läuft, ohne das du das direkt in den Quelltext schreiben musst.
    Dazu nimmst du dann den "new"-Operator. Und dieser Liefert dann einen Zeiger auf das Objekt zurück.

    Mitarbeiter* Mit4 = new Mitarbeiter("Hans", "Meier");

    Wichtig ist aber dabei, dass du wenn du diesen Mitarbeiter nicht mehr brauchst dieses Objekt wieder selbst zerstören musst, und zwar mit dem "delete"-Operator. Sonst müllt dir das Objekt bis zum Ende des Programms den Speicher zu.
    Ich hoffe dir ist jetzt alles klar.... sonst frag einfach nochmal nach.

    Mfg _Ocin_



  • Also dynamische vs. statische (aufn Stack) Instanzierung iss eigentlich ganz einfach 😃

    statisch : immer wenn geht !

    dynamisch : immer wenn wirklich musst !

    Typische Faelle wenn man dynamische Instanzierung braucht:
    - wenn man Arrays mit variabler Anzahl hat, also zur compilezeit nich weiss wieviel man braucht. (container ! die stl nimmt dir da gern arbeit ab)
    - wenn der stack zu gross wird, / die instanz eh nimmer aufn stack passt
    - virtuelle konstruktoren / Objektfabriken (sprich du unterscheidest an hand irgendwelcher dynamsicher daten von welcher speziellen klasse eine Instanz genau sein soll)
    - PIMPL Idom
    - die lebenszeit der Instanzen nicht ohne weiteres bestimmbar iss ... bzw, Instanzen das erzeugende Object/Instanz überleben muss ... (Garbage Collectoren etc ... )

    Ciao ....



  • Hallo,
    danke für eure angeregte Diskussion. Nun seh ich schon etwas klarer. Das Problem mit den Konstruktoren ist keines, ich hab doch nochmal gemailt und mich "entschuldigt" für meine Blödheit 😉 Ich habe in der Header Datei den Konstruktor deklariert, aber nicht implementiert in der cpp Datei. Folglich sagte der Copmpiler zu recht, dass er einen Konstruktor vermißt.
    Was meine frage angeht, war Ocin am nächsten dran 😉 In der Tat war das mein Problem. Ich hab nicht so recht eingesehen, wozu ich dynamisch Speicher bereitstellen soll, um eine Klasse zu erzeugen. Ich wußte zwar, dass es darum geht, wenn man nicht weiss, wieviele Objekte man erzeugen will bzw muss, aber ich dachte halt an das klassische Beispiel mit einer Anwendung, die eine Datenbank nutz. Ich lege eine Variable an, erzeuge so einen Mitarbeiter, schreibe ihn in die Datenbank und wenn dann noch einer gebracht wird bzw erzeugt werden muss, nehme ich einfach die gleiche Variable wieder. Der "alte" Mitarbeiter ist ja schon in der Datenbank. Natürlich berücksichtigt dieses Beispiel nicht, dass man eventuell alle erzeugten Mitarbeiter im Speicher haben möchte. Ich glaube, man muss einfach ein Gefühl für diese dynamischen Speichergeschichten bekommen.
    Jedenfalls danke ich euch für eure Erklärungen. Es wird wohl noch etwas dauern, bis ich auch mal mit Tipps helfen kann. Wenn es soweit ist, werde ich micht revangieren 🙂
    Grüße

    paloncino


Anmelden zum Antworten