Variablen der Klasse 1 in Klasse 2 verwenden...

dannyesl

Mitglied
Hi,
Ich muss in meiner neuen Aufgabe in der Uni folgendes machen:
- Ich habe 2 Klassen (Artikel und Buchung)
- Artikel hat Stammdaten als Variablen; Buchung hat Bewegungsdaten als Variablen
- Die Menge der im Lager vorhandenen Artikel ist auch in der Klasse Artikel
- In der Klasse Buchung werden Einbuchung und Ausbuchung durchgeführt
- Nun brauche ich ja um eine Einbuchung zu machen die Menge aus der Klasse Artikel.

Wie kriege ich die aus der anderen Klasse? Pointer? Referenzvariable?
Kann mir da bitte jemand helfen?
Vielen Dank im Voraus
 
Die Klasse Buchung muss irgendwie Bescheid bekommen, wo das Objekt der Klasse Artikel ist/liegt.
Du könntest das z.B. in den Konstruktor mit reinpacken:
C++:
class Buchung
{
  public:
    Buchung(Artikel *ArtikelHaus);
  private:
    Artikel *m_ArtikelHaus;
}
Buchung::Buchung(Artikel *ArtikelHaus)
{
  m_ArtikelHaus = ArtikelHaus;
}
C++:
// z.B.
int main()
{
  Artikel *ArtikelHaus = new Artikel();
  Buchung *Buchung = new Buchung(Artikel);
  // oder
  Artikel ArtikelHaus = Artikel();
  Buchung Buchung = Buchung(&ArtikelHaus);
}
 
Vielen Dank schonmal! :)
Noch ein paar Fragen:

C++:
Buchung::Buchung(Artikel *ArtikelHaus)
{
  m_ArtikelHaus = ArtikelHaus;
}
Das heißt ich habe noch eine weitere Variable? Also nicht nur menge sondern noch eine m_menge? Muss ich dazu auch noch diese Variable in der Klasse Artikel angeben?
C++:
int main()
{
  Artikel ArtikelHaus = Artikel();
  Buchung Buchung = Buchung(&ArtikelHaus);
}

Könntest du mir kurz diese Zeilen erklären?^^

PS: Ich programmiere Objektorientiert...also mit 3 Dateien (.h; main.cpp; .cpp)
 
Das heißt ich habe noch eine weitere Variable? Also nicht nur menge sondern noch eine m_menge? Muss ich dazu auch noch diese Variable in der Klasse Artikel angeben?
Ja, damit die Klasse Buchung auch behalten kann wer der Artikel ist, gibt es noch eine Membervariable (in der Klasse als private definiert).

Könntest du mir kurz diese Zeilen erklären?^^
Zuerst wird ein Objekt der Klasse Artikel erstellt und initialisiert.
Danach ein Objekt der Klasse Buchung und wird mit dem ersten Parameter &ArtikelHaus initialisiert. Da ein Zeiger erwartet wird, musst du ein "&" davorstellen. Dieser Parameter wird dann im Objekt Buchung hinterlegt (m_menge).

Ich hoffe, ich konnte es einigermaßen erklären.

PS: Ich programmiere Objektorientiert...also mit 3 Dateien (.h; main.cpp; .cpp)
Ich auch, nur geht hier im Forum schlecht darzustellen ;)
 
Zuletzt bearbeitet:
Alles klar ;)

Habe das jetzt mal versucht umzusetzen, aber er gibt mir immer fehlermeldungen...
Vllt magst du mal drüber schauen und mir kurz sagen wo die fehler sind...

Warum wird eigentlich manchmal angezeigt bei "<<" oder ">>" oder "+=" "-=" : "Es ist kein Operator damit kompatibel?
 

Anhänge

Folgende Fehler:
  • Bei main() muss der Rückgabetyp int sein!
  • Die Funktionen in der Klasse sind so deklariert: ausbuchung/einbuchung(Artikel *menge)
    In der Definition steht ein &-Zeichen statt einem Sternchen.
    Dieses &-Zeichen musst du folglich in der ganzen Funktion entfernen (also immer vor menge).
  • Du hast in der main() im zweiten If (if(auswahl==2)) den Bezeichner menge als Artikel nicht definiert bzw. nur temporär im Konstruktor der Buchung. Danach wird er gelöscht. Folglich müsste das so aussehen:
C++:
Artikel menge = Artikel();
Buchung meineBuchung(&menge);
// ...
case 1:
  meineBuchung.einbuchung(&menge);
// ...
case 2:
  meineBuchung.ausbuchung(&menge);
Und weiter unten auch entsprechend ein &-Zeichen voranstellen.


Damit funktioniert das ganze, ich habe es nochmal angehängt, falls du es vergleichen möchtest.

Warum wird eigentlich manchmal angezeigt bei "<<" oder ">>" oder "+=" "-=" : "Es ist kein Operator damit kompatibel?
Weil bei eigenen Objekten solche Operatoren nicht definiert sind.
z.B. hast du ein Autohaus und möchtest mit dem Operator += die Anzahl der Autos hochzählen, dann würde das so gehen:
C++:
class Autohaus
{
  public:
    Autohaus(int _Autos) : this->Autos(_Autos) {};
    int Autos;
    void operator +=(int i)
    {
      Autos += i;
    }
}
Autohaus ah = Autohaus(0);
cout << ah.Autos << endl;
ah += 3;
cout << ah.Autos << endl;

Aber du hast in deiner Klasse Artikel gar nicht den Operator -= definiert...Ich glaube dein Code funktioniert von der Logik (<=>Kompilieren) her nicht.
 

Anhänge

Zuletzt bearbeitet:
Vielen vielen Dank :)
Nur warum gibt er mir, wenn ich den Artikel angelegt habe nicht die Bezeichnung aus?..
Bezeichnung ist ja string....bei der get methode habe ich den return bezeichnung....aber er gibt mir nichts aus....der rest geht also artikelnummer etc.
Außerdem gibt er mir bei der Ein/Ausbuchung immer die Adresse aus bei "Neue Menge im Lager..." was ist da falsch****
Ich komm nicht weiter....
 
Zuletzt bearbeitet:
Zum ersten Problem:
Du musst die Variable Artikel verwalteArtikel; außerhalb der DoWhile-Schleife definieren, da sie sonst bei jedem Durchlauf (z.B. nach dem Anlegen eines Artikels) die Variable wieder löscht.

Zum zweiten Problem:
Füge erstmal folgende Methoden zur Klasse Artikel hinzu:
C++:
void Artikel::operator +=(int i)
{
    menge += i;
    MessageBox(NULL, "test", "test", 0);
}
void Artikel::operator -=(int i)
{
    menge -= i;
}
Dann die Funktionen Buchung::ein/ausbuchung() durch folgendes ersetzen:
C++:
void Buchung::ausbuchung(Artikel *menge)
{
	system("cls");
	setDatum();

	*mengePtr -= ausbuchungsmenge;

	cout << "\t\tNeue Menge im Lager: " << mengePtr->getMenge() << endl;
	cout << "\t\tWeiter mit beliebiger Taste..." << endl;
	_getch();
}

void Buchung::einbuchung(Artikel *menge)
{
	system("cls");
	setDatum();

	*mengePtr += einbuchungsmenge;

	cout << "\t\tNeue Menge im Lager: " << mengePtr->getMenge() << endl;
	cout << "\t\tWeiter mit beliebiger Taste..." << endl;
	_getch();
}
Bei der Addition von aus/einbuchungsmenge habe ich ein Sternchen vor mengePtr hinzugefügt, damit wir auf das Objekt zugreifen und damit den Operator +=/-= aufrufen und nicht den Zeiger verändern.

Dann bei "Neue Menge im Lager" habe ich mengePtr durch mengePtr->getMenge() ersetzt, damit wir die Menge ausgeben und nicht den Zeiger (hier muss kein Sternchen hin, weil dieses bereits im -> drinsteckt).

Außerdem musst du im Konstruktor die Membervariablen aus/einbuchungsmenge von Buchung initialisieren, z.B.:
C++:
Buchung::Buchung(Artikel *menge)
{
	mengePtr = menge;
	einbuchungsmenge = 3;
	ausbuchungsmenge = 3;
}
Noch dazu meineBuchung außerhalb der Hauptschleife definieren und mit verwalteArtikel "verbinden", wobei du dann die Variable menge (Artikel) nicht mehr brauchst.

Übrigens kannst du alle get-Funktionen in der Artikel-Klasse als inline definieren, damit sie schneller ablaufen. Falls du nicht weiß was das ist, google' einfach.

Siehe Anhang!
 

Anhänge

Zuletzt bearbeitet:
Zurück