Hallo,
bei solchen Frage ist es für den Antwortenden am einfachsten das Programm einfach 'hinzuklatschen' ;-). Das mache ich jetzt einfach mal. Da Du wahrscheinlich Anfänger(in) bist, wirst Du einiges davon nicht verstehen.
Aufgaben dieser Art sind im Grunde für den Anfänger ungeeignet. Es enthält in einer mehr oder weniger professionellen Lösung bereits viel zu viele Programmiermuster, die man kennen müsste!
Die Aufteilung in Dateien überlasse ich Dir. Du solltest es in 4 .cc- und 3 .h-Dateien unterbringen.
Du hast garantiert Fragen ;-)
#include <iostream>
#include <memory> // std::unique_ptr<>
#include <string>
#include <vector>
using namespace std; // nie im Header !!
class Immobilie {
public:
virtual ~Immobilie() = 0 {} // virtual wegen Ableiten
// Eingabe über friend-Funktion
friend std::istream& operator>>( std::istream& in, Immobilie& immo )
{
immo.do_eingabe( in );
return in;
}
// Ausgabe über friend-Funktion
friend std::ostream& operator<<( std::ostream& out, const Immobilie& immo )
{
immo.do_ausgabe( out ); // hier wird ggf. die abgeleitete Methode aufgerufen
return out;
}
protected:
Immobilie() = default; // ist protected, um sicher zu stellen, dass nur eine abgeleitete Klasse angelegt werden kann
virtual void do_eingabe( std::istream& in )
{
std::getline( std::getline( in >> std::ws, adresse ) >> baujahr >> std::ws, besitzer );
}
virtual void do_ausgabe( std::ostream& out ) const
{
out << "Addr.: " << adresse << "\n";
out << "Baujahr: " << baujahr << "\n";
out << "Besitzer: " << besitzer << "\n";
}
private:
// int n; // das ist unnötig, da dies über die Klasse definiert ist
std::string adresse; // benutze in Header-Dateien den Prefix std::
int baujahr; // mache die Member private
string besitzer;
};
class Wohnimmobilie : public Immobilie {
public:
enum class Art { Wohnung, Haus };
Wohnimmobilie() = default;
protected:
void do_eingabe( std::istream& in ) override
{
Immobilie::do_eingabe( in );
int artFlag;
if( in >> artFlag )
m_art = artFlag > 0? Art::Haus: Art::Wohnung;
}
void do_ausgabe( std::ostream& out ) const override
{
Immobilie::do_ausgabe( out ); // erst den allgemeinen Teil
out << (m_art == Art::Wohnung? "Wohnung": "Haus") << "\n";
}
private:
Art m_art;
};
class Geschaeftsimmobilie : public Immobilie {
public:
enum class Wohnung { vorhanden, keine };
Geschaeftsimmobilie() = default;
protected:
void do_eingabe( std::istream& in ) override
{
Immobilie::do_eingabe( in );
int wohnungFlag;
if( in >> wohnungFlag )
wohnung_vorhanden = wohnungFlag > 0? Wohnung::vorhanden: Wohnung::keine;
}
void do_ausgabe( std::ostream& out ) const override
{
Immobilie::do_ausgabe( out ); // erst den allgemeinen Teil
out << "Geschaeft " << (wohnung_vorhanden == Wohnung::vorhanden? "mit Wohnung": "") << "\n";
}
private:
Wohnung wohnung_vorhanden;
};
int main()
{
std::vector< std::unique_ptr< Immobilie > > alleImmobilien;
cout << "Geben Sie so viele Wohnungen ein, wie Sie wollen! bis 0" << endl;
for( int n; cout << "...> ", cin >> n; )
{
if( n == 0 )
break; // ... und fertig
std::unique_ptr< Immobilie > immo;
if( n%2 == 0 ) // gerade Zahl -> Wohnimmobilie
{
cout << "Wohnimmobilie:\n";
immo = std::make_unique< Wohnimmobilie >();
}
else // ungerade -> Geschäftsimmobilie
{
cout << "Geschaeftsimmobilie:\n";
immo = std::make_unique< Geschaeftsimmobilie >();
}
if( cin >> *immo )
alleImmobilien.emplace_back( std::move(immo) );
}
cout << "\nes wurden " << alleImmobilien.size() << " Immobilien eingegeben" << endl;
for( auto i = alleImmobilien.rbegin(); i != alleImmobilien.rend(); ++i ) // in umgekehrter Reihenfolge
{
cout << **i << endl;
}
return 0;
}
Das Programm beendet sich, wenn man bei der Eingabe einen Fehler macht, oder wenn man als Immobilien-Typ eine 0 eingibt.
und so könnte eine Dialog mit diesem Programm aussehen:
Geben Sie so viele Wohnungen ein, wie Sie wollen! bis 0
...> 2
Wohnimmobilie:
Kreuzstr. 89
2001
Max Mustermann
2
...> 1
Geschaeftsimmobilie:
Hauptstr. 3
1970
Hein Bloed
0
...> 2
Wohnimmobilie:
Blumenweg 1
1999
Rita Rot
0
...> 0
es wurden 3 Immobilien eingegeben
Addr.: Blumenweg 1
Baujahr: 1999
Besitzer: Rita Rot
Wohnung
Addr.: Hauptstr. 3
Baujahr: 1970
Besitzer: Hein Bloed
Geschaeft
Addr.: Kreuzstr. 89
Baujahr: 2001
Besitzer: Max Mustermann
Haus