Zum Inhalt springen

Grundsatzfragen eines Neulings...


Empfohlene Beiträge

Geschrieben

Hi Leute,

Zuerst mal zum Grundsätzlichen:

gibt es einen Unterschied zwischen:

int i; und int& i;

MyClass mc; und MyClass& mc;

und wo ist der Unterschied zwischen:

MyClass mc; und MyClass mc();

Nun zum Objektorientierten:

Wenn ich folgende Klassen habe:


class MyOtherClass {

  public:

    MyOtherClass() { }

};


class MyClass {

  private:

    MyOtherClass m_moc;

  public:

    MyClass(MyOtherClass moc) : m_moc(moc) { }

    MyOtherClass getIt() { return m_moc; }

};

und dann folgende main Methode:

int main() {

  MyOtherClass moc;

  MyClass* mc = MyClass(moc);

  MyOtherClass* moc2 = &mc->getIt();    //Wegen dieser Zeile schmeißt das Programm

                                        //zur Laufzeit einen Fehler, warum?(1)

  delete moc2;                          //Oder auch wegen dieser. (1)

  delete mc;

  /**

   * Nun zu einem anderen Versuch:

   */


  MyOtherClass moc2;

  MyOtherClass moc3;

  MyClass mc2(moc2);

  moc3 = mc2.getIt();                   //Was passiert hier mit dem Objekt, welches

                                        //bisher in moc3 gespeichert war? (2)

}

(1): Oder darf ich moc2 nicht deleten, weil der return von mc->getIt() eine Referenz ist und auf einem anderen Speicher liegt? Wenn dies stimmt, würde ja nach delete mc; der Pointer moc2 einfach irgendwohin zeigen oder? Also müsste ich ihn auch nicht mehr deleten. Oder aber, was für mich logischer wäre, ich muss/darf/kann moc3 nicht deleten weil das Objekt eben in einem anderen Speicher liegt und daher einfach nicht deleted werden kann, sondern mit Außlaufen der Funktion main() wird das Object einfach gelöscht. Wenn der Pointer außerhalb der main() deklariert worden wäre, würde er dann halt irgendwohin zeigen. (Abgesehen davon, dass nach Auslaufen der main() das Programm beendet wird, aber mal rein theoretisch.) (2): Meiner Meinung nach bleibt es im Speicher bis die main() ausläuft, aber wenn nun mein Prog ein Server wäre und der länger laufen würde und so etwas öfters vorkommen würde, dann würde er doch den ganzen Speicher voll schreiben oder nicht? Aber wie soll ich das dann sonst realisieren? Ich hätte einfach gerne eine Referenzvariable (in diesem Fall moc3), die das Ergebnis einer getter-Anweisung zugewiesen bekommt. Aber da ich ja eine Referenzvariable immer sofort initialisieren muss und MyOtherClass moc3 = mc2.getIt(); nicht möglich ist, kann ich das doch nicht anders machen oder doch? Und dann habe ich noch eine Frage: Wenn ich jetzt ein Objekt von einer Methode bekomme, dass nicht im dem Speicher liegt, wo z.b.: ein Objekt liegen würde, welches mit new MyClass(); initialisiert worden ist, und ich einen Pointer habe, der außerhalb der Funktion liegt, in welche das Objekt zurückgegeben wurde, wie kann ich jetzt den Pointer so auf das Objekt zeigen lasse, dass es nach Auslaufen der Funktion immer noch existiert? Hier ein Beispiel (Mit Hilfe der oben definierten Klassen):

  MyOtherClass* p_moc;


  void meineFunction() {

    MyOtherClass moc;

    MyClass mc(moc);


    mc.getIt();                  //Wie bekomme ich den Rückgabewert diese Methode in

                                 //meinen Pointer p_moc rein, sodass der Pointer

                                 //auch nach dem Auslaufen von meineFunction() noch

                                 //auf ein existierendes Objekt zeigt?

    *p_moc = mc.getIt();         //Dies würde ja einen Fehler erzeugen, da p_moc

                                 //auf keinen reservierten Speicher zeigt.

    p_moc = new MyOtherClass();

    *p_moc = mc.getIt();         //Wird hier das vorherige Objekt überschrieben?

                                 //Oder gibt es für die zeile mit dem new eine

                                 //Alternative, mit der ich den Speicher zwar

                                 //reserviere, jedoch kein Objekt initialisiere,

                                 //damit ich dann ein Objekt "reinladen" kann?

  }

Und eine letzte Frage hätte ich noch: Wenn ich in C++ ein Objekt einer Klasse in einem Pointer seiner Basisklasse habe, gibt es eine Möglichkeit herrauszufinden von welchem Typ das Objekt wirklich ist? In Java gibts da ja die Möglichkeit:

  if(myObject instanceof MyClass) {

    ...

  }

Gibt es so etwas auch in C++?

Ich hoffe jemand hat meine Fragen verstanden und kann mir bei diesen dämlichen Problemen helfen!

mfg

Stampede

Geschrieben
gibt es einen Unterschied zwischen:

int i; und int& i;

MyClass mc; und MyClass& mc;

Ja, gibt es. Der jeweils zweite Code definiert eine Referenz (falls er nicht gerade in einer Klassendeklaration steht). Und da Referenzen bei der Definition initialisiert werden müssen, sind beide kein gültiger C++-Code.

und wo ist der Unterschied zwischen:

MyClass mc; und MyClass mc();

Der erste Code definiert eine Instanz des Typs MyClass namens mc. Der zweite Code deklariert eine Funktion namens mc, die eine Instanz von MyClass zurückgibt.

MyOtherClass* moc2 = &mc->getIt();
Das geht nicht. getIt liefert eine temporäre Kopie. Wenn du die nicht benutzt, wird sie gleich wieder zerstört. Keinesfalls darfst du daher ihre Adresse aufnehmen. Delete darfst du da sowieso nicht machen. Du hast ja auch kein new gemacht.

moc3 = mc2.getIt(); //Was passiert hier mit dem Objekt, welches

//bisher in moc3 gespeichert war? (2)

Es wird überschrieben. Was genau passiert, hängt vom Inhalt des Zuweisungsoperators ab.

Und dann habe ich noch eine Frage: Wenn ich jetzt ein Objekt von einer Methode bekomme, dass nicht im dem Speicher liegt, wo z.b.: ein Objekt liegen würde, welches mit new MyClass(); initialisiert worden ist, und ich einen Pointer habe, der außerhalb der Funktion liegt, in welche das Objekt zurückgegeben wurde, wie kann ich jetzt den Pointer so auf das Objekt zeigen lasse, dass es nach Auslaufen der Funktion immer noch existiert?

Die Lebenszeit eines Objekts kannst du nicht beeinflussen, indem du irgendwelche Pointer darauf zeigen lässt. In deinem Beispiel kommst du nicht um new herum.

Wenn ich in C++ ein Objekt einer Klasse in einem Pointer seiner Basisklasse habe, gibt es eine Möglichkeit herrauszufinden von welchem Typ das Objekt wirklich ist?

...

Gibt es so etwas auch in C++?

Ja, gibt es. Such mal nach dynamic_cast. Du solltest das aber nicht allzu oft benutzen. Meistens gibt es da besser Lösungen, und exzessiver Gebrauch von dynamic_cast ist oft ein Indiz für ein Designproblem.
Geschrieben
Ja, gibt es. Der jeweils zweite Code definiert eine Referenz (falls er nicht gerade in einer Klassendeklaration steht). Und da Referenzen bei der Definition initialisiert werden müssen, sind beide kein gültiger C++-Code.

Ja schön und gut, aber was ist dann der jeweils linke (erste) Code? Und wie verhält sich eine variable dieses Typs?

Und was ist wenn der jeweils zweite Typ in einer Klassendeklaration steht?

Das geht nicht. getIt liefert eine temporäre Kopie. Wenn du die nicht benutzt, wird sie gleich wieder zerstört. Keinesfalls darfst du daher ihre Adresse aufnehmen. Delete darfst du da sowieso nicht machen. Du hast ja auch kein new gemacht.

Ok, dass ich es nicht löschen darf ist mir klar, aber funktionieren tut es! Nur lebt die Variable, die ich da habe halt nur bis zum Ende der Funktion in der sie retuniert wurde, oder nicht? Im Versuch hat es funktioniert, daher meine Verwirrung!

Die Lebenszeit eines Objekts kannst du nicht beeinflussen, indem du irgendwelche Pointer darauf zeigen lässt. In deinem Beispiel kommst du nicht um new herum.

Mir geht es nicht darum die Lebenszeit zu verlängern, sondern darum irgendwie das Objekt in den Freispeicher zu bekommen, in dem es überleben kann. Wie kann ich das machen?

p_moc = new MyOtherClass();

*p_moc = mc.getIt();

Bei diesem Code überschreibe ich ja das Objekt an der Stelle p_moc oder nicht? Ich möchte einfach Speicherleaks verhindern, darum meine Fragen!

Danke schonmal

mfg

Stampede

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...