Anfängerfrage zu Pointer (soll auf Objekt anderer Klasse zeigen)
-
Wäre das so möglich?
class Verweis { private: AndereKlasse* ptr; public: Verweis(AndereKlasse Objekt); } Verweis::Verweis(AndereKlasse Objekt) { ptr=AndereKlasse Objekt; }
-
Nein. Bitte schau dir doch erst die Grundlagen an..
class A { B* p_; public: A(B* p) : p_(p) {} };Bei dir wird im Konstruktor kein Pointer sondern ein Objekt übergeben.
-
cooky451 schrieb:
Nein. Bitte schau dir doch erst die Grundlagen an..
class A { B* p_; public: A(B* p) : p_(p) {} };Bei dir wird im Konstruktor kein Pointer sondern ein Objekt übergeben.
Ich hab nur leider im Moment keine Zeit mich noch groß mit Grundlagen zu beschäftigen, da ich das Projekt an dem ich sitze bis 31. Januar abgegeben haben muss.
Also hab das richtig verstanden, dass ich als Argument an den Konstruktor einen Pointer übergeben muss, der dann der entsprechenden Eigenschaft des erzeugten Objekts zugewiesen wird?
-
Cyborgeagle schrieb:
Ich hab nur leider im Moment keine Zeit mich noch groß mit Grundlagen zu beschäftigen, da ich das Projekt an dem ich sitze bis 31. Januar abgegeben haben muss.
Das ist hart. Ändert aber nichts daran dass du mit C++ nicht weit kommen wirst, wenn du von C++ nicht viel verstehst.
Also hab das richtig verstanden, dass ich als Argument an den Konstruktor einen Pointer übergeben muss, der dann der entsprechenden Eigenschaft des erzeugten Objekts zugewiesen wird?
Naja, das ist so ziemlich genau das, was du im ersten Beitrag gefordert hast, nur eine Spur technischer formuliert.
Also ja, wenn es das ist was du brauchst, dann musst du das so machen.
Wenn nicht, dann nicht, aber das können wir nicht wissen
-
hustbaer schrieb:
Cyborgeagle schrieb:
Ich hab nur leider im Moment keine Zeit mich noch groß mit Grundlagen zu beschäftigen, da ich das Projekt an dem ich sitze bis 31. Januar abgegeben haben muss.
Das ist hart. Ändert aber nichts daran dass du mit C++ nicht weit kommen wirst, wenn du von C++ nicht viel verstehst.
Naja den Teil sollten eigentlich meine Projektpartner machen, da die aber wohl damit nicht klar gekommen sind, muss ich das jetzt irgendwie ausbügeln damit ich das Projekt noch fertig wird bis Abgabetermin.
hustbaer schrieb:
Cyborgeagle schrieb:
Also hab das richtig verstanden, dass ich als Argument an den Konstruktor einen Pointer übergeben muss, der dann der entsprechenden Eigenschaft des erzeugten Objekts zugewiesen wird?
Naja, das ist so ziemlich genau das, was du im ersten Beitrag gefordert hast, nur eine Spur technischer formuliert.
Also ja, wenn es das ist was du brauchst, dann musst du das so machen.
Wenn nicht, dann nicht, aber das können wir nicht wissen
Ja das ist was ich brauche. Danke für deine Hilfe.
-
Ok ich hab noch einige Fehler. Die wohl alle mit den Pointern zusammenhängen, also schein da noch was nicht richtig verstanden zu haben, Syntaxfehler zu machen oder irgendwas nicht bedacht zu haben.
#include <iostream> #include <vector> using namespace std; #include "GUI.h" #include "buchung.h" #include "Einzelzimmer.h" #include "doppelzimmer.h" #include "Kunde.h" void CGUI::applikation() { int i, zwahl, rwahl, anDay, abDay; char Vname[30], Nname[30]; vector<CBuchung> Buchungen; Hotelzimmer Einzelzimmer[30]; Doppelzimmer Zimmer[20]; vector<CKunde> Kunden; Hotelzimmer *pZimmer; CKunde *pKunde; for(i=0;i<30;i++) { Einzelzimmer[i].set_Zimmernr(i+1); } for(i=0;i<20;i++) { Zimmer[i].set_Zimmernr(i+1); } for(i=0;i<5;i++) { Einzelzimmer[i].set_Raucherzimmer(true); //true=Raucherzimmer , false=Nichtraucher Zimmer[i].set_Raucherzimmer(true); } // Kundendaten cout << "Bitte geben Sie ihren Vornamen und Nachnamen ein." << endl; cout << "Vorname:" << endl; cin >> Vname[30]; cout << "Nachname:" << endl; cin >> Nname[30]; // Zimmerwunsch cout << "Wollen sie ein Einzel- oder Doppelzimmer?" << endl << "Geben sie 1 für Einzelzimmer und 2 für Doppelzimmer ein." << endl; cin >> zwahl; cout << "Wollen sie ein Raucherzimmer?" << endl << "Geben sie 1 für Raucherzimmer und 2 für Nichtraucherzimmer ein." << endl; cin >> rwahl; // Zeitraum abfragen cout << "Wann wollen sie anreisen?" << endl << "Geben sie eine Zahl zwischen 1 und 31 ein." << endl; cin >> anDay; cout << "Wann wollen sie abreisen?" << endl << "Geben sie eine Zahl zwischen 1 und 31 ein." << endl; cin >> abDay; if(Buchungen.size()==0) // aller erste Buchung auslösen { Kunden.push_back(CKunde(&Vname[30], &Nname[30])); pKunde=&Kunden.front(); if(zwahl==1) { if(rwahl==1) { pZimmer=&Einzelzimmer[0]; } else pZimmer=&Einzelzimmer[5]; } else if(rwahl==2) { pZimmer=&Zimmer[0]; } else pZimmer=&Zimmer[5]; Buchungen.push_back(CBuchung(&anDay, &abDay, pZimmer, pKunde)); } // Testausgabe cout << "Ihre Buchung:" << endl; cout << "Kundendaten: " << endl; cout << "Anreisetag: " << Buchungen.front().getanTag(); cout << "Abreisetag: " << Buchungen.front().getabTag(); }class CBuchung { private: int anTag, abTag, anzahlTag; Hotelzimmer *Raum; CKunde *Customer; public: //Konstruktor CBuchung(int anDay, int abDay,Hotelzimmer *pZimmer,CKunde *pKunde); //Destruktor ~CBuchung(); //setter void setanTag(int anDay); void setabTag(int abDay); //getter int getanTag(); int getabTag(); int getAnzahlTag(); }; CBuchung::CBuchung(int anDay, int abDay,Hotelzimmer *pZimmer,CKunde *pKunde) { anTag=anDay; abTag=abDay; Raum=pZimmer; Customer=pKunde; }Folgende Fehler spuckt er mir aus:
buchung.h|5|Fehler: »Hotelzimmer« bezeichnet keinen Typ|
buchung.h|6|Fehler: »CKunde« bezeichnet keinen Typ|
buchung.h|11|Fehler: »Hotelzimmer« wurde nicht deklariert|
buchung.h|11|Fehler: »CKunde« wurde nicht deklariert|
GUI.cpp|76|Fehler: keine passende Funktion für Aufruf von »CBuchung::CBuchung(int*, int*, Hotelzimmer*&, CKunde*&)«|
GUI.cpp|76|Anmerkung: Kandidaten sind:|
buchung.h|11|Anmerkung: CBuchung::CBuchung(int, int, int*, int*)|
buchung.h|11|Anmerkung: keine bekannte Umwandlung für Argument 3 von »Hotelzimmer*« nach »int*«|
buchung.h|1|Anmerkung: CBuchung::CBuchung(const CBuchung&)|
buchung.h|1|Anmerkung: Kandidat erwartet 1 Argument, 4 angegeben|
Was habe ich falsch gemacht?
-
Damit du Typen (Klassen/Structs/Enums) verwenden kannst, musst du die erstmal bekannt machen (deklarieren).
D.h. bevor du in CBuchung einen Zeiger auf ein Hotelzimmer machen kannst, musst du erstmal Hotelzimmer deklarieren.Dazu kannst du entweder das entsprechende Header-File mit
#include "Filename.h"reinholen, oder du machst ne fwd. declaration:class Hotelzimmer; class CBuchung { private: int anTag, abTag, anzahlTag; Hotelzimmer *Raum; // ...Das selbe dann nochmal für CKunde.
Damit sollten alle Fehler behoben sein.
Tip: Die ersten 4 Fehler sind direkte Folge davon dass die Typen nicht deklariert wurden. Und der 5. Fehler ist ein Folgefehler.
Da du unbekannte Typen bei der Deklaration des Konstruktors CBuchung::CBuchung verwendet hast, hat der Compiler die einfach mal durch "int" ersetzt. Damit er irgendwie weiter machen kann.
Daher kommt das "CBuchung::CBuchung(int, int, int*, int*)" in der Anmerkung, obwohl so eine Funktion in deinem Programm gar nicht vorkommt.
-
Gut danke das war Lösung.
-
Ok ich hab dann noch zwei kleine Fragen. Kann ich mir die Pointer so zurückgeben lassen?
int CBuchung::getRaum(){ return Raum; }Da ja der Pointer auf ein Objekt zeigt, kann dann so darauf zurückgreifen?
Buchungen.getRaum()->get_Zimmernr();
-
Cyborgeagle schrieb:
Kann ich mir die Pointer so zurückgeben lassen?
int CBuchung::getRaum(){ return Raum; }Technisch gesehen: Jein. Was (welchen Typ) soll
getRaum()zurückgeben? Anders gefragt: welchen Typ hatCBuchung::Raum()?Ästhetisch gesehen: NEIN!
1. Siehe Datenkapselung.
2. Eine Buchung kann keinen Raum haben höchstens eine Zimmernummer.
3. ...Cyborgeagle schrieb:
Da ja der Pointer auf ein Objekt zeigt, kann dann so darauf zurückgreifen?
Buchungen.getRaum()->get_Zimmernr();Technisch gesehen: Wenn der Rückgabewert von
getRaum()vom Typ Zeiger auf einen Raum ist und Raum die Methodeget_Zimmernr()hat: Ja.Was habt ihr denn als Vorgabe bekommen (möglichst Wortlaut bzw. pdf)? Ohne genau zu wissen was das Ding wenns fertig ist leisten soll:
Wir verwalten ein Hotel.
Unser Hotel hat mehrere Zimmer.
Jedes Zimmer hat eine Nummer.
Jedes Zimmer hat eine Anzahl an Betten.
Unser Hotel hat mehrere Kunden.
Ein Kunde hat eine Nummer.
Unser Hotel [i]hat ein[i] Buch in dem Buchungen aufgenommen werden.
Eine Buchung besteht aus Zeitraum, Kundennummer und Zimmernummer.Hat man eine derartige Überlegung angestellt darf man beginnen mit og. Objekten herumzuspielen

-
Swordfish schrieb:
Cyborgeagle schrieb:
Kann ich mir die Pointer so zurückgeben lassen?
int CBuchung::getRaum(){ return Raum; }Technisch gesehen: Jein. Was (welchen Typ) soll
getRaum()zurückgeben? Anders gefragt: welchen Typ hatCBuchung::Raum()?Ästhetisch gesehen: NEIN!
1. Siehe Datenkapselung.
2. Eine Buchung kann keinen Raum haben höchstens eine Zimmernummer.
3. ...Also Pointer ist in der Klasse so deklariert wie weiter oben auch ersichtlich:
Hotelzimmer *RaumWie kann ich mir diesen dann zurückgeben lassen oder wie könnte ich mir das zurückgeben lassen auf was er zeigt?
Swordfish schrieb:
Cyborgeagle schrieb:
Da ja der Pointer auf ein Objekt zeigt, kann dann so darauf zurückgreifen?
Buchungen.getRaum()->get_Zimmernr();Technisch gesehen: Wenn der Rückgabewert von
getRaum()vom Typ Zeiger auf einen Raum ist und Raum die Methodeget_Zimmernr()hat: Ja.Ja so ist es.
Swordfish schrieb:
Was habt ihr denn als Vorgabe bekommen (möglichst Wortlaut bzw. pdf)? Ohne genau zu wissen was das Ding wenns fertig ist leisten soll:
Wir verwalten ein Hotel.
Unser Hotel hat mehrere Zimmer.
Jedes Zimmer hat eine Nummer.
Jedes Zimmer hat eine Anzahl an Betten.
Unser Hotel hat mehrere Kunden.
Ein Kunde hat eine Nummer.
Unser Hotel [i]hat ein[i] Buch in dem Buchungen aufgenommen werden.
Eine Buchung besteht aus Zeitraum, Kundennummer und Zimmernummer.Hat man eine derartige Überlegung angestellt darf man beginnen mit og. Objekten herumzuspielen

Wir hatten uns eine Aufgabenstellung aus dem Internet genommen von dieser Seite. Sie hat keine konkreten Vorgaben gemacht.
Erstellen Sie ein Objektmodell für folgende Aufgabenstellung: Ein Hotel hat 50 Zimmer, davon 30 Einzel- und 20 Doppelzimmer. Für das Abwickeln von Reservierungen muss jeweils ein freies Einzel- oder Doppelzimmer gefunden und für einen Gast gebucht werden. Ist ein Zimmer gebucht, darf es nicht als frei angezeigt werden, wenn ein anderer Gast ein Zimmer buchen möchte. Da viele Gäste Nichtraucherzimmer bevorzugen, sind 25 Einzel- und 15 Doppelzimmer Nichtraucherzimmer. Bei der Reservierung eines Zimmers kann ein Gast angeben, ob er in einem Raucher- oder Nichtraucherzimmer übernachten möchte.
Implementieren Sie Ihr Objektmodell und lassen Sie mehrere Gäste in Ihrem Hotel in der Funktion main() Zimmer reservieren. Zeigen Sie zur Kontrolle am Ende Ihres Programms die Anzahl der freien Zimmer an.
-
Cyborgeagle schrieb:
Also Pointer ist in der Klasse so deklariert wie weiter oben auch ersichtlich:
Hotelzimmer *RaumWie kann ich mir diesen dann zurückgeben lassen [...]
Naja, deine
int CBuchung::getRaum()gibt - wie sie oben steht einen Wert vom Typintzurück.CBuchung::Raumist aber vom TypHotelzimmer*.Cyborgeagle schrieb:
oder wie könnte ich mir das zurückgeben lassen auf was er zeigt?
Das willst Du nicht bzw. noch weniger.
Swordfish schrieb:
Wir hatten uns eine Aufgabenstellung aus dem Internet genommen [...]
Dafür brauchst Du nichtmal einen blanken Pointer...