C++ Klassenerstellung - Bankenbeispiel - Fehler (type not)



  • #ifndef MITARBEITER_H_
    #define MITARBEITER_H_
    #include "Kunde.h"
    #include <string>
    class Mitarbeiter
    {
    
    private:
    	Kunde meinKunde = new Kunde();
    	std::string name;
    
    public:
    	Mitarbeiter();
    	virtual ~Mitarbeiter();
    
    	std::string getName();
    
    	void setName(std::string name);
    
    	// Get- und Set-Methoden f�r das Verweisattribut.
    	Kunde getMeinKunde();
    
    	void setMeinKunde(Kunde meinKunde);
    
    };
    
    #endif /*MITARBEITER_H_*/
    
    #ifndef KUNDE_H_
    #define KUNDE_H_
    #include "Mitarbeiter.h"
    #include <string>
    class Kunde
    {
    	// privater Teil der Klasse (darauf hat nur die Klasse Zugriff)
    private:
    	// Verweisattribut.
    	Mitarbeiter meinBetreuer = new Mitarbeiter();
    	// Informationsattribnut.
    		std::string name;
    
    	// öffentlicher Teil der Klasse (alles darunter angegebene kann von 
    	// jedem verwendet werden)
    public:
    	/* Ein Konstruktor zum Generieren eines Auto-Objektes */
    	Kunde();
    	/* Ein Destruktor zum Zerstören eines Auto-Objektes */
    	virtual ~Kunde();
    
    	// Get- und Set-Methoden für die Attribute.
    	/**
    	 * @return the name
    	 */
    	std::string getName();
    
    	/**
    	 * @param name the name to set
    	 */
    	void setName(std::string name);
    
    	/**
    	 * @return the meinKundenBerater
    	 */
    	Mitarbeiter getMeinBetreuer();
    
    	/**
    	 * @param meinKundenBerater the meinKundenBerater to set
    	 */
    	void setMeinBetreuer(Mitarbeiter meinBetreuer);
    };
    
    #endif /*KUNDE_H_*/
    

    und die c++ - dateien jeweils:

    #include "kunde.h"
    #include "mitarbeiter.h"
    #include <iostream.h>	// für cout
    #include <string>
    Kunde::Kunde()
    {
    	cout << "Kunde konstruktor";
    	setMeinBetreuer(m);
    			//Dem Mitarbeiter diesen Kunden zuweisen.
    
    	}
    
    Kunde::~Kunde()
    {
    	}
    
    Kunde::getName()
    {
    	return name;
    	}
    
    Kunde::setName(std::string name)
    {
    	this->name = name;
    	}
    Kunde::getMeinBetreuer()
    {
    	return meinBetreuer;
    	}
    Kunde::setMeinBetreuer(Mitarbeiter meinBetreuer)
    {
    	this->meinBetreuer = meinBetreuer;
    	}
    
    #include "Mitarbeiter.h"
    #include "Kunde.h"
    #include <string>
    Mitarbeiter::Mitarbeiter()
    {
    	name = "Test";
    	meinKunde = "Kunde";
    }
    
    Mitarbeiter::~Mitarbeiter()
    {
    }
    Mitarbeiter::setName(std::string name)
    {
    	this->name = name;
    }
    Mitarbeiter::getName()
    {
    	return name;
    }
    Mitarbeiter::getMeinKunde()
    {
    	return meinKunde;
    }
    Mitarbeiter::setMeinKunde(Kunde meinKunde)
    {
    	this->meinKunde = meinKunde;
    }
    

    Woran liegt es jetzt das beispielsweise mein compiler mir sagt:

    `Kunde' does not name a type SchulprojektC++/src Mitarbeiter.h line 9

    Ich hoffe ihr könnt mir helfen:/

    gruß jensa



  • du brauchst für deine Klassen Kunde und Mitarbeiter Forwarddeklarationen, sonst sind die sich nicht gegenseitig bekannt.
    Also einfach vor die Klassendeklaration von Mitarbeiter einfügen:

    // --- includeguards, includes ...
    class Kunde;
    class Mitarbeiter { 
    // ...
    };
    
    // --- includeguards, includes ...
    class Mitarbeiter;
    class Kunde { 
    // ...
    };
    

    Initialisierung in der Klassendeklaration geht nicht:

    Kunde meinKunde = new Kunde();
    
    Mitarbeiter meinBetreuer = new Mitarbeiter();
    

    eine Initialisierung mit new ist hier aber eh nicht korrekt, bei Stackobjekten ist kein new erforderlich und auch kein manuelles delete.

    Ich nehme an du kommst von Java? 😉



  • Du hast vorher mit Java gearbeitet, oder?
    Weil mit new erstellst du ein Objekt auf dem Heap wie bei Java, nur ist der Rückgabetyp ein Pointer und deine ganzen Variablendefinitionen sind eben keine sondern Instanzen eben jener Objekte.

    Desweiteren hast du ein Include-Problem. Kunde inkludiert Mitarbeiter das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das ... ... ...



  • Fellhuhn schrieb:

    Kunde inkludiert Mitarbeiter das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das ... ... ...

    Sehr schön erklärt 😉


  • Administrator

    Fellhuhn schrieb:

    Desweiteren hast du ein Include-Problem. Kunde inkludiert Mitarbeiter das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das Mitarbeiter inkludiert das Kunde inkludiert das ... ... ...

    Das stimmt nicht ganz. Die Include-Guards verhindern dies. Das Problem liegt wo anders.
    Nehmen wir an, es wird zuerst die Mitarbeiter.h includiert. MITARBEITER_H_ ist noch nicht definiert, wird es aber jetzt. Kunde.h wird nun includiert, wegen der Anweisung in Mitarbeiter.h. In Kunde.h wird KUNDE_H_ definiert, da es noch nicht definiert war. Als nächstes soll Mitarbeiter.h includiert werden. Diese Headerdatei wird aber einfach übersprüngen, da MITARBEITER_H_ bereits definiert ist. Dadurch ist die Klasse Mitarbeiter in der Klasse Kunde nicht bekannt. Die Klasse Mitarbeiter wird erst nach der Klasse Kunde deklariert.
    Das ganze kann man auch anders rum durchspielen, wenn zuerst Kunde.h includiert wird.

    Es wurde bereits erwähnt, ich füge es nochmals dazu:
    Forward Declaration

    Zudem solltest du dir wirklich die Unterschiede zwischen Java und C++ klar machen 🙂

    Grüssli



  • Hallo,
    in der Tat hab vorher mit Java gearbeitet und wollte jetzt einmal ein altes Java Beispiel in C++ umwandlen.

    Habt ihr evtl tipps wo ich da evtl etwas gutes zum umsteigen finden könnte?

    Wie müsste ich denn die Objekterzeugung umwandeln?



  • #ifndef MITARBEITER_H_
    #define MITARBEITER_H_
    #include "Kunde.h"
    #include <string>
    class Mitarbeiter
    {
    
    private:
    	Kunde meinKunde = new Kunde();// <- das macht mal in C++ noch nicht! Ausserdem gibt der Ausdruck new Kunde einen *Kunde zuruck, so dass Kunde* meinKunde stehen muss.
    	std::string name;
    
    };
    


  • Zeus schrieb:

    Kunde meinKunde = new Kunde();// <- das macht mal in C++ noch nicht! };
    

    Jetzt überred' sie nicht zu Pointern und Heap-(/Freememory-)objekten, wo n Stackobjekt genausogut funktioniert 😉


  • Administrator

    jensa schrieb:

    Habt ihr evtl tipps wo ich da evtl etwas gutes zum umsteigen finden könnte?

    Kauf dir ein gutes C++ Buch. Da du dich wegen Java schon ein wenig im Programmieren auskennen solltest, denke ich kannst du durchaus "Die C++ Programmiersprache" von Bjarne Stroustrup verkraften.

    jensa schrieb:

    Wie müsste ich denn die Objekterzeugung umwandeln?

    Vielleicht sollte man da ein zwei Dinge klar stellen:
    1. C++ hat keinen Garbage Collector. Die Speicherverwaltung musst du selbst übernehmen.
    2. Es gibt mehrere Wege ein Objekt zu erzeugen. Man kann das Objekt auf den Heap setzen, es auf den Stack tun oder aber in eine Klasse kapseln und es kommt dann am gleichen Ort hin, wie auch das Objekt der Klasse hinkommt.

    int* i = new int; // int liegt auf dem Heap.
    // ...
    delete i; // gibt das Objekt wieder frei. Ganz wichtig! Sonst hast du ein Memory Leak.
    
    void foo()
    {
      int i; // i liegt auf dem Stack.
    } // wird automatisch am Ende des Scopes freigegeben.
    
    class Foo
    {
    private:
      int i; // i ist ein Objekt, welches mit Foo erstellt wird.
      int* p; // p ist ein Zeiger auf ein int-Objekt.
              // p kann auf ein Stack- oder Heapobjekt verweisen.
    }
    

    Aber naja, am besten mal die Grundlagen durchlesen. Denn es ist ganz wichtig anzumerken, dass Java und C++ sich stark unterscheiden, auch wenn es anfänglich nicht der Fall zu sein scheint. Aber bekanntlich trügt der Schein. 😉

    Grüssli


Anmelden zum Antworten