Array mit Objekten in einer Klasse



  • Hallo,

    normal programmiere ich in Java, aber heute hab ich mich mal mit C++ versucht und nun komme ich nicht mehr weiter.

    Der Compiler spuckt mir folgende Fehlerliste aus:

    http://grab.by/grabs/9b6c0c235c824c6dacc167444efed6cf.png

    So wie ich das sehe erkennt er nicht das von mir definierte array sorten, den Datentyp/Objekt Eis und den int arrayZaehler nicht.
    Aber warum nicht?

    Eisverwaltung.h:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class EisVerwaltung {
    
    private:
    	EisVerwaltung() {};
    	EisVerwaltung( const EisVerwaltung& );
    	EisVerwaltung & operator = (const EisVerwaltung &);
    	static int arrayZaehler=0;
    
    public:
    	static EisVerwaltung& getInstances(); 
    	~EisVerwaltung() {};
    	Eis sorten[]=new Eis[5];
    
    	int getArrayZaehler() { return arrayZaehler;};
    	void addEis(Eis eis);
    	void printAll();
    };
    

    den zugehörigen Ausschnitt aus der EisVerwaltung.cpp:

    void addEis(Eis eis) {
    	if (arrayZaehler < sizeof(sorten)/sizeof(sorten[0])) {
    		sorten[arrayZaehler] = eis;
    		arrayZaehler++;
    	} else
    		cout << "Kein Platz mehr fŸr neues Eis!";
    }
    

    Kann es sein, dass ich nur die Adresse übergeben sollte und dann zuweisen darf, wegen call-by-value?

    Meine Fragen:
    1. Wie kann ich ein array anlegen und in der Funktion addEis ein Objekt dem array zuweisen?
    2. Warum erkennt arrayZaehler nicht?

    Ich sag schonmal Danke

    Gruß



  • Dir fehlt zu viel Grundverständnis von C++, um dir die Probleme auf die Schnelle zu erklären. Am besten schaust du dir mal diesen Thread an und besorgst dir ein entsprechendes Anfängerbuch. C++ mag zwar oberflächliche Gemeinsamkeiten mit Java haben, hat aber komplett andere Konzepte. Du musst also sehr viele Dinge neu lernen.



  • +1 für das, was Nexus sagte.

    Acronis schrieb:

    Eisverwaltung.h:

    #include <iostream>
    #include <string>
    using namespace std;
    

    Diese using-Direktive hat in Headerdateien nichts verloren.

    class EisVerwaltung {
    
    private:
    	EisVerwaltung() {};
    	EisVerwaltung( const EisVerwaltung& );
    	EisVerwaltung & operator = (const EisVerwaltung &);
    	static int arrayZaehler=0;
    

    Ein Semikolon hinter Funktionskörpern ist überflüssig. Ein Initialisierer für arrayZaehler ist hier nicht erlaubt. static int arrayZaehler ist nur eine Deklaration und keine Definition. Die Variable muss noch irgendwo angelegt werden.

    public:
    	static EisVerwaltung& getInstances(); 
    	~EisVerwaltung() {};
    	Eis sorten[]=new Eis[5];
    

    Wenn Dein Destruktor nichts tut, brauchst Du ihn auch nicht. Zumindest keinen inline-Destruktor, der nichts tut. Die Deklaration Eis sorten[] ist illegal. Arrays funktionieren in C und C++ nicht so, wie Du es aus Java kennst.



  • heißt also, dass ich in c++ kein array anlegen kann, womit ich dann beliebig die Referenz des Array-Feldes auf das gewünschte Objekt umleiten lassen kann?

    Wie macht man dann sowas in C++? verkettete Listen?



  • Acronis schrieb:

    heißt also, dass ich in c++ kein array anlegen kann, womit ich dann beliebig die Referenz des Array-Feldes auf das gewünschte Objekt umleiten lassen kann?

    Du denkst zu stark in Java. C++ hat nicht wie Java Referenzsemantik, sondern Wertsemantik. Ein Element eines Arrays ist ein Objekt, keine Referenz. Sowie das Array selbst ein Objekt und keine Referenz ist. Ein Array ist in C++ auch keine Klasse mit Methoden, und du musst die Grösse bei der Definition angeben.

    Deswegen mein Ratschlag mit dem Neulernen. Du wirst sonst auf Dauer nur Probleme haben, weil du versuchst, Konzepte 1:1 zu übertragen.


Anmelden zum Antworten