Würde mich über Ratschläge freuen.



  • Hallo,

    ich bin noch Programmier-Anfängerin und würde mich über eure Hilfe sehr freuen. Ich habe folgendes Problem:
    Ich möchte ein Programm schreiben, das aus den zwei Klassen Restaurant und Reservierung besteht.
    Der Konstruktor von der Klasse Restaurant ist dafür zuständig, mir gemäß der Anzahl der Tische Speicher zu allokieren. Die einzelnen Elemente des Arrays werden auf false gesetzt, somit sind diese frei bzw. nicht belegt.
    Der ist meines Erachtens auch richtig. Hoffe ich zumindest 🙂
    Der Destruktor müsste auch richtig sein.

    Womit ich Probleme habe ist der operator+= und operator<<. Mit dem operator+= möchte ich, dass der dort srehende Tisch (int tischnummer) für mein Objekt vom Typ Restaurant reserviert wird. Dies geschieht mit true. Aber dies scheint nicht ganz so zu klappen, wie ich mir das vorgestellt habe. Auch bekomme ich als Programmausgabe nichts Gescheites, irgendwelche Stack-Probleme.
    Weiß einer Rat, wie ich das Prgramm modifizieren sollte? Mein Compiler zeigt mir leider keine Fehler an, scheint dann wohl syntaktisch in Ordnung zu sein?

    #include <iostream>
    using namespace std;
    
    class Reservierung;
    
    class Restaurant {
    	private:
    	string name;
    	int anzahl_tische;
    	bool* tische;
    	public:
    	//a) Konstruktor
    	Restaurant(string, int);
    	//b) Destruktor
    	void delete_dyn();
    	~Restaurant();
    	Restaurant& operator+=(const Reservierung&);
    	friend ostream& operator<<(ostream& os, Restaurant);
    };
    
    class Reservierung {
    	private:
    	int tischnummer;
    	public:
    
    	friend class Restaurant;
    };
    
    Restaurant::Restaurant(string n, int a): name(n), anzahl_tische(a){
    
    	tische = new bool[anzahl_tische];
    
    	for (int i=0; i<anzahl_tische;i++){
    
    	tische[i]=false;
    	}	
    	}
    
    		void Restaurant::delete_dyn(){
    		delete[] tische;
    		}
    		Restaurant::~Restaurant(){
    		this->delete_dyn();
    		}
    
    	Restaurant& Restaurant::operator+= (const Reservierung& s ){
    	Restaurant temp(name, anzahl_tische);
    	temp.tische[0]=s.tischnummer;
    	temp.tische[0]=true;
    	return *this;
    	}
    
    	ostream& operator<<(ostream& os, Restaurant k){
    		os<<"Der Name des Rasturants ist: "<<k.name<<endl;
    		for(int i=0; i< k.anzahl_tische ; i++){
    			os<<"Nr. "<<i<<" ist "<<k.tische[i]<<endl;
    			} 
    
    		return os;
    		}
    
    int main (){
    
    	Restaurant ha("Ritz", 5);
    	Reservierung x;
    	ha+=x;
    	cout<<ha<<endl;
    
    	return 0;
    	}
    


  • DragonLady schrieb:

    Der Konstruktor von der Klasse Restaurant ist dafür zuständig, mir gemäß der Anzahl der Tische Speicher zu allokieren.

    Ist das dein Design oder das eines Aufgabenstellers? Ist auf jeden Fall schon mal komisch, das man bei einem Restaurant keine zusätzlichen Stühle mehr reinstellen kann.

    Womit ich Probleme habe ist der operator+=

    Das wird this nie geändert.



  • #include <iostream>
    using namespace std; // Im header kein using namespace
    
    class Reservierung;
    
    class Restaurant {
    private:
    	string name;
    	int anzahl_tische;
    	bool* tische; // Warum nicht std::vector<bool> bzw. std::array<bool>?
    public:
    	// a) Konstruktor
    	Restaurant(string, int);
    	// b) Destruktor
    	void delete_dyn();
    	~Restaurant();
    	Restaurant& operator+=(const Reservierung&);
    	friend ostream& operator<<(ostream& os, Restaurant);
    };
    
    class Reservierung {
    private:
    	int tischnummer;
    public:
    	friend class Restaurant;
    };
    
    Restaurant::Restaurant(string n, int a): name(n), anzahl_tische(a){
    	tische = new bool[anzahl_tische]; // s.o.
    
    	for (int i=0; i<anzahl_tische;i++){
    		tische[i]=false;
    	}	
    }
    
    // nicht benötigt mit std::vector
    void Restaurant::delete_dyn() {
    	delete[] tische;
    }
    
    // nicht benötigt mit std::vector
    Restaurant::~Restaurant() {
    	this->delete_dyn();
    }
    
    Restaurant& Restaurant::operator+= (const Reservierung& s ){
    	// Wenn du eine Reservierung hinzufügst, warum erstellst du du ein neues Restaurant?
    	Restaurant temp(name, anzahl_tische);
    	// Warum greifst du auf das neue Restaurant zu, nicht auf das richtige?
    	// Warum tische[0] ?
    	temp.tische[0]=s.tischnummer;
    	temp.tische[0]=true;
    	// warum gibst du das gleiche Objekt zurück, ohne was an ihm verändert zuhaben?
    	return *this;
    }
    
    ostream& operator<<(ostream& os, Restaurant k){
    	os << "Der Name des Rasturants ist: " << k.name << endl; // besser '\n' anstelle von endl;
    	for(int i=0; i< k.anzahl_tische ; i++){
    		os << "Nr. " << i << " ist " << k.tische[i] << endl; // s.o.
    	} 
    	return os;
    }
    
    int main () {
    	Restaurant ha("Ritz", 5);
    	Reservierung x;
    	ha += x;
    	cout << ha << endl;
    
    	return 0; // implizit
    }
    


  • Hallo,

    naja, ich soll mit dem operator+= die tischnummer mit Eins belegen und diesen belegten Tisch meinem Objekt Restaurant hinzufügen. Also der int tischnummer ist ein Tisch von anzahl_tische, lediglich im Gegensatz zu den anderen Tischen belegt. Der ausgabeoperator soll mir dann im Anschluß dessen alle nicht belegten Tische untereinander ausgeben. Das klappt irgendwie nicht, weil mir die Verknüpfungen nicht gelungen sind.

    Den Destruktor habe ich gemäß der Aufgabenstellung hinzuzufügen. Genau wie den Konstruktor. Die müssten doch richtig sein, oder?



  • bool* tische;

    Das ist eine Vorgabe



  • Dragonlady schrieb:

    bool* tische;

    Das ist eine Vorgabe

    Weißt Du überhaupt, wie Pointer/CArrays funktionieren/sind?



  • Hi,

    ja, im Groben schon. Ich bin halt noch eine absolute Anfängerin. Also ich bin da nicht so gut.



  • DargonLady schrieb:

    Hallo,

    naja, ich soll mit dem operator+= die tischnummer mit Eins belegen und diesen belegten Tisch meinem Objekt Restaurant hinzufügen. Also der int tischnummer ist ein Tisch von anzahl_tische, lediglich im Gegensatz zu den anderen Tischen belegt. Der ausgabeoperator soll mir dann im Anschluß dessen alle nicht belegten Tische untereinander ausgeben. Das klappt irgendwie nicht, weil mir die Verknüpfungen nicht gelungen sind.

    Hola, dass ist schwer zu verstehen.

    So, wie ich es deute soll der operator+= (ich improvisiere!)

    suche einen index i mit tische[i] = false (das ist ein freier Tisch)
    wenn kein solch i:
      setze die tischnummer der Reservierung auf -1 (das ist improvisiert!)
      ende
    sonst:
      setz tische[i] auf true
      setz tischnummer der Reservierung auf i
    ende
    

    Das ergäbe für mich Sinn, allerdings dürftest Du dann keine Referenz auf const Reservierung übergeben, d.h. Restaurant::operator+=(Reservierung&);



  • Leider soll ja eine Referenz zurückgegeben werden 🙂
    Das ist wirklich kompliziert. Ich habe schon so viele Programme geschrieben, dies sogar erfolgreich. In der Uni mussten wir immer die Programme abgeben. Habe ich auch immer geschafft.
    Nun möchte ich nur ein paar alte Klausuraufgaben machen und Nichts klappt mehr. Das nennst sich wohl programmieren. lol



  • DragonLady schrieb:

    Leider soll ja eine Referenz zurückgegeben werden 🙂

    Daran ändert sich ja auch nix.

    Restaurant& operator+=(Reservierung&);
    

    siehst Du: gibt eine Referenz zurück.
    Ich sagte nur, dass der Parameter keine const Reservierung& mehr sein darf.

    Vom Prinzip her ändert mein Vorschlag eh nicht viel - ich habe mir nur Gedanken gemacht wie es gemeint sein könnte.
    Aber ich schau morgen beim Bleigiessen noch mal... 😉



  • Ahso, ja, jetzt verstehe ich, was du meinst.
    Ok, danke dir. Das wäre sehr nett von dir.



  • Furble Wurble schrieb:

    So, wie ich es deute soll der operator+= (ich improvisiere!)
    [blablabla...]

    Da ich nicht denke, dass meine Improvisation sonderlich hilfreich war, aber schon denke, dass Du im großen und ganzen richtige Ansätze hast versuch ich es anders.

    Du schreibst:

    DargonLady schrieb:

    ich soll mit dem operator+= die tischnummer mit Eins belegen und diesen belegten Tisch meinem Objekt Restaurant hinzufügen.

    Gegeben diese Reservierung:

    DragonLady schrieb:

    class Reservierung {
    	private:
    	int tischnummer;
    	public:
    
    	friend class Restaurant;
    };
    

    Wie und wer soll da die Tischnummer setzen? Kein Konstruktor und tischnummer ist private .
    Entweder Du baust noch einen Konstruktor, oder nur Restaurant (weil eine friend Klasse) kann das.

    Und wenn Du dann eine Reservierung mit tischnummer hast sieht der operator+= in Pseudocode so aus

    wenn -1 < tischnummer && tischnummer < anzahl_tische
     wenn tische[tischnummer] == false
       tische[tischnummer] = true
    return *this;
    

    Richtig? Dann brauchst Du auch nicht an den Parametern rumschrauben.



  • Ich habe schon mehrere Klausuraufgaben programmiert. Alle sind kein Problem, lediglich an diesem Programm beisse ich mir die Zähne aus. Also den Konstruktor und Destruktor habe ich ja wohl richtig(?) implementiert. Nur der operator+= und der Ausgabeoperator klappen nicht. Oder verstehe ich die aufgabenstellung nicht richtig?

    c) Geben Sie die Definition eines operator+= an, welcher Memberfunktion der Klasse Restaurant ist, eine Referenz auf ein Objekt vom Typ Reservierung ubergeben bekommt und den in der Reservierung vermerkten Tisch für das Restaurant belegt. Der Operator soll eine Referenz auf das ver änderte Restaurant-Objekt zurückliefern.

    d) Geben Sie die Definition eines Ausgabeoperators für die Klasse Restaurant an, welcher den Namen des Restaurants sowie die Tischnummern aller noch freien Tische in diesem Restaurant untereinander ausgibt. Der Operator soll friend der Klasse Restaurant sein (die entsprechende Deklaration muss nicht mit angegeben werden).



  • also momentan schaut mein Code wie folgt aus:

    #include <iostream>
    using namespace std;
    
    class Reservierung;
    
    class Restaurant {
    	private:
    	string name;
    	int anzahl_tische;
    	bool* tische;
    	public:
    	//a) Konstruktor
    	Restaurant(string, int);
    	//b) Destruktor
    	//void delete_dyn();
    	//~Restaurant();
    	Restaurant& operator+=(const Reservierung&);
    	friend ostream& operator<<(ostream& os, Restaurant);
    };
    
    class Reservierung {
    	private:
    	int tischnummer;
    	public:
    
    	friend class Restaurant;
    };
    
    Restaurant::Restaurant(string n, int a): name(n), anzahl_tische(a){
    
    	tische = new bool[anzahl_tische];
    
    	for (int i=0; i<anzahl_tische;i++){
    
    	tische[i]=false;
    	}
    
    	}
    
    	/*	void Restaurant::delete_dyn(){
    		delete[] tische;
    		}*/
    		//Restaurant::~Restaurant(){
    		//delete[] tische;
    		//this->delete_dyn();
    		//}
    
    	Restaurant& Restaurant::operator+= (const Reservierung& s ){
    	Restaurant temp(name, anzahl_tische);
    	//s.tischnummer=1;
    	temp.tische[0]=s.tischnummer;
    	temp.tische[0]=true;
    	return *this;
    	}
    
    	ostream& operator<<(ostream& os, Restaurant k){
    		os<<"Der Name des Rasturants ist: "<<k.name<<endl;
    		for(int i=0; i< k.anzahl_tische && k.tische[i]==false ; i++){
    			os<<"Nr. "<<i<<" ist "<<k.tische[i]<<endl;
    			} 
    
    		return os;
    		}
    
    int main (){
    
    	Restaurant ha("Ritz", 9);
    	//Reservierung x;
    	//ha+=x;
    	cout<<ha<<endl;
    
    	return 0;
    	}
    

    Das Problem ist doch, dass ich tischnummer im operator+= gar nicht ändern kann. Der compiler sagt: read only. Es muss dort eine += Operation rein, nur wie?



  • Dragonlady schrieb:

    Ich habe schon mehrere Klausuraufgaben programmiert. Alle sind kein Problem, lediglich an diesem Programm beisse ich mir die Zähne aus. Also den Konstruktor und Destruktor habe ich ja wohl richtig(?) implementiert.

    Vielleicht nicht schön, aber richtig - jedenfalls in Deinem ersten Post.
    Das Problem ist wohl wirklich, dass Du die Aufgabe missverstehst.

    Dragonlady schrieb:

    c) Geben Sie die Definition eines operator+= an, welcher Memberfunktion der Klasse Restaurant ist, eine Referenz auf ein Objekt vom Typ Reservierung ubergeben bekommt und den in der Reservierung vermerkten Tisch für das Restaurant belegt. Der Operator soll eine Referenz auf das ver änderte Restaurant-Objekt zurückliefern.
    [...]
    Das Problem ist doch, dass ich tischnummer im operator+= gar nicht ändern kann. Der compiler sagt: read only. Es muss dort eine += Operation rein, nur wie?

    Lies nochmal meinen letzten Post:

    • Du erstellst eine Reservierung. Mit Tischnummer i.
      Das geschieht in main , dazu musst Du die Klasse Reservierung noch so verändern, dass, z.B. in einem Konstruktor die Tischnummer gesetzt werden kann.
    • Diese Reservierung wird im folgenden nicht mehr geändert.
    • Diese Reservierung übergibst Du als Argument an den operator+=()
    • Der operator+=() verändert *this (Das Restaurant!), indem es den entsprechenden bool an der Stelle tische[s.tischnummer]=true setzt. (siehe dazu meinen letzten Pseudocode).
    • Fertig ist der Lack mit operator+=()

    Wenn's immer noch nicht klingelt, folgende Fragen aus dem Thread hast Du noch nicht beantwortet:
    wozu ist das Objekt temp im operator+=() ?
    Wie willst Du die Tischnummer der Reservierung setzen?

    Wenn ich mir die Evolution Deines Codes in 24h ansehe, bin ich etwas weniger optimistisch, was evtl. anstehende Prüfungen anbelangt...


Anmelden zum Antworten