Frage von KleinerFetzen, 39

c++ Klassen schreiben. Schreiben Sie eine Klasse (mit Konstruktor, Destruktor, Kopierkonstruktor, Zuweisungsoperator), die zu jedem Zeitpunkt...?

Ich bin noch ein Anfänger in C++ und soll nun folgende Aufgabe lösen:

Schreiben Sie eine Klasse (mit Konstruktor, Destruktor, Kopierkonstruktor, Zuweisungsoperator), die zu jedem Zeitpunkt "weiß", wieviele Instanzen dieser Klasse gerade existieren. Diese Information soll über eine Methode anzahlInstanzen() dieser Klasse (Rückgabetyp unsigned int) abfragbar sein. Schreiben Sie ein Hauptprogramm zum gründlichen Testen der Klasse und lösen Sie folgende Teilaufgaben:

Implementierung der Klasse wie oben beschrieben Überladen Sie den Operator +, so dass Additionen zwischen Klassenobjekten und die Addition eines Integers (von links und von rechts) zu einem Klassenobjekt möglich sind. D.h. folgendes Hauptprogramm soll fehlerlos kompilieren (Das Ergebnis des Operators + soll wieder ein Objekt der Klasse sein. Der Wert des Resultats ist aber unerheblich).

int main()
{
  Klasse x,y;
  int i;
       
  x+y,(i=Klasse::anzahlInstanzen());
  cout<<i<<",";
 
  x+y;
  i=Klasse::anzahlInstanzen();
  cout<<i<<endl;
  return 0;

}

Lassen Sie das gegebene Programmstück laufen. Vergleichen Sie die Ausgaben der Version der Klasse mit Kopierkonstruktor und einer Version ohne Kopierkonstruktor. Interpretieren Sie die Ergebnisse.

Ich habe schon ein Grundgerüst, aber irgendwie kommt bei meiner Methode anzahlInstanzen immer nur 1 raus. Woran kann das liegen? Hier mein Programm:

#include<iostream>
using namespace std;

int instanzen=0;

class Klasse {
  
  
 public:
 
  Klasse () { ++instanzen;} 
 
  static int anzahlInstanzen () {return instanzen;}
  
  Klasse (const Klasse &x) {}
  
  void print() {
   cout << "Instanzen: " << instanzen <<endl<<endl;}
  
~Klasse() {cout << "Bin schon weg!"<<endl;}

};









int main () {

  Klasse x;
  Klasse y;
  Klasse z;

  cout << x.anzahlInstanzen <<endl;
  cout << z.anzahlInstanzen << endl;
  z.print();
 

return 0;
}

Bin für jede Hilfe dankbar!

Antwort
von ralphdieter, 13

Dein Programm gibt bei mir folgendes aus:

1
1
Instanzen: 3

Bin schon weg!
Bin schon weg!
Bin schon weg!

Der Ausdruck x.anzahlInstanzen ist ein Zeiger auf eine statische Funktion. Dafür gibt es aber keine Überladung von operator<<(). Die einzig brauchbare Umwandlung ist nach bool — daher die "1" (cout<<true; macht dasselbe).

Hier hast Du die weniger schöne Seite des Überladens und der automatischen Konvertierung kennengelernt: Manchmal findet der Compiler eine subtile Möglichkeit, den Code zu übersetzen, obwohl man eine klare Fehlermeldung erwartet hätte (hier: "() bei Funktionsaufruf vergessen.")

Im Copy-Konstruktor musst Du übrigens instanzen auch erhöhen, und im Destruktor wieder erniedrigen ("wieviele Instanzen dieser Klasse gerade existieren"). Und instanzen sollte wirklich besser ein static member sein (siehe Antwort von Elmo2999).

Aber Du bist ja noch lange nicht fertig...

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten