Witam. Mam dane zadanie:
Utwórz klasę bazową samochod; w klasie mają być informacje o marce (typ string), liczbie cylindrów (typ int), i właścicielu (typ osoba opisany poniżej). Następnie utwórz opisującą samochód ciężarowy klasę ciezarowy wywiedzioną z klasy samochod, mającą dodatkowe składowe: ładowność wyrażoną w tonach (typ double), oraz dopuszczalną masę przyczepy, wyrażoną w kilogramach (typ int). Zapewnij klasom rozsądną liczbę potrzebnych konstruktorów, funkcji dostępu i modyfikacji oraz przeciążony operator przypisania i konstruktor kopiujący.
Definicję klasy osoba podano:
class osoba
{
public:
osoba();
osoba(string nazwisko);
osoba(const osoba& obiekt);
string odczytaj_nazwisko() const;
osoba& operator=(const osoba& prawa);
friend istream& operator>>(istream& wej, osoba& dane);
friend ostream& operator<<(ostream& wyj, osoba& dane);
private:
string nazwisko;
};
Napisałem coś takiego:
//plik samochod.h
#ifndef SAMOCHOD_H
#define SAMOCHOD_H
#include "osoba.h"
#include <string>
using namespace std;
namespace car
{
class samochod
{
public:
samochod();
samochod(string marka, int ilosc, osoba czlek);
samochod(const samochod& obiekt);
string odczytaj_marke() const;
void zmien_marke(string nowa_marka);
int odczytaj_cylindry() const;
void zmien_cylindry(int nowa_ilosc);
osoba odczytaj_wlasciciela() const;
void zmien_wlasciciela(string nowy_wlasciciel);
samochod operator=(const samochod& prawa);
protected: //protected, bo później przy pzeciążaniu operatora
//przypisania w klasie wywiedzionej były problemy z
//dostępem, nawetprzez funkcje modyfikacji
string marka;
int cylindrow;
osoba wlasciciel;
};
}
#endif
//plik samochod.cpp
#include <iostream>
#include <string>
#include "osoba.h"
#include "samochod.h"
using namespace std;
namespace car
{
samochod::samochod() : marka("Nie podano marki"), cylindrow(0) {}
samochod::samochod(string marka, int ilosc, osoba czlek)
: marka(marka), cylindrow(ilosc), wlasciciel(czlek) {}
samochod::samochod(const samochod& obiekt)
{
marka = obiekt.marka;
cylindrow = obiekt.cylindrow;
wlasciciel = obiekt.wlasciciel;
}
string samochod::odczytaj_marke() const
{
return marka;
}
void samochod::zmien_marke(string nowa_marka)
{
marka = nowa_marka;
}
int samochod::odczytaj_cylindry() const
{
return cylindrow;
}
void samochod::zmien_cylindry(int nowa_ilosc)
{
cylindrow = nowa_ilosc;
}
osoba samochod::odczytaj_wlasciciela() const
{
return wlasciciel;
}
void samochod::zmien_wlasciciela(string nowy_wlasciciel)
{
wlasciciel = nowy_wlasciciel;
}
samochod samochod::operator=(const samochod& prawa)
{
marka = prawa.marka;
cylindrow = prawa.cylindrow;
wlasciciel = prawa.wlasciciel;
return *this;
}
}
//plik osoba.h
#ifndef OSOBA_H
#define OSOBA_H
#include <string>
using namespace std;
namespace car
{
class osoba
{
public:
osoba();
osoba(string nazwisko);
osoba(const osoba& obiekt);
string odczytaj_nazwisko() const;
osoba& operator=(const osoba& prawa);
friend istream& operator>>(istream& wej, osoba& dane);
friend ostream& operator<<(ostream& wyj, osoba& dane);
private:
string nazwisko;
};
}
#endif
//plik osoba.cpp
#include "osoba.h"
#include <iostream>
#include <string>
using namespace std;
namespace car
{
osoba::osoba() : nazwisko("Nie podano jeszcze nazwiska") {}
osoba::osoba(string nazwisko) : nazwisko(nazwisko) {}
osoba::osoba(const osoba& obiekt) : nazwisko(obiekt.nazwisko) {}
string osoba::odczytaj_nazwisko() const
{
return nazwisko;
}
istream& operator>>(istream& wej, osoba& dane)
{
wej >> dane.nazwisko;
return wej;
}
ostream& operator<<(ostream& wyj, osoba& dane)
{
wyj << endl << dane.nazwisko << endl;
return wyj;
}
osoba& osoba::operator=(const osoba& prawa)
{
nazwisko = prawa.nazwisko;
return *this;
}
}
//plik ciezarowy.h
#ifndef CIEZAROWY_H
#define CIEZAROWY_H
#include <string>
namespace car
{
class ciezarowy : public samochod
{
public:
ciezarowy ();
ciezarowy (string marka, int ilosc, osoba czlek, double ladownosc, int masa);
ciezarowy (const ciezarowy& obiekt);
double odczytaj_ladownosc();
int odczytaj_mase();
void zmien_ladownosc(double nowa_ladownosc);
void zmien_mase(int nowa_masa);
ciezarowy operator=(const ciezarowy& prawa);
private:
double ladownosc;
int masa;
};
}
#endif
//plik ciezarowy.cpp
#include <iostream>
#include "osoba.h"
#include "samochod.h"
#include "ciezarowy.h"
using namespace std;
namespace car
{
ciezarowy::ciezarowy () : samochod(), ladownosc(0), masa(0) {}
ciezarowy::ciezarowy (string marka, int ilosc, osoba czlek, double ladownosc, int masa)
: samochod(marka, ilosc, czlek), ladownosc(ladownosc), masa(masa) {}
ciezarowy::ciezarowy (const ciezarowy& obiekt)
{
marka = obiekt.marka;
cylindrow = obiekt.cylindrow;
wlasciciel = obiekt.wlasciciel;
ladownosc = obiekt.ladownosc;
masa = obiekt.masa;
}
double ciezarowy::odczytaj_ladownosc()
{
return ladownosc;
}
int ciezarowy::odczytaj_mase()
{
return masa;
}
void ciezarowy::zmien_ladownosc(double nowa_ladownosc)
{
ladownosc = nowa_ladownosc;
}
void ciezarowy::zmien_mase(int nowa_masa)
{
masa = nowa_masa;
}
ciezarowy ciezarowy::operator=(const ciezarowy& prawa)
{
ladownosc = prawa.ladownosc;
masa = prawa.masa;
return *this;
}
}
I program, zupełnie bezsensowny, ale testujący chyba wszelkie składowe klas:
#include <iostream>
#include <string>
#include "samochod.h"
#include "ciezarowy.h"
using namespace std;
using namespace car;
int main ()
{
samochod samochod, opisany('Lamborghini', 300, 'Krzysiek');
ciezarowy ciezarowka(), opisana("MAN", 200, "Krzysiek"), bardziej("MAN", 225, "Krzysiek", 500, 700);
cout << "Opisany - " << opisany.odczytaj_marke() << endl;
cout << "Opisany - " << opisany.odczytaj_cylindry() << endl;
cout << "Opisany - " << opisany.oczytaj_wlasciciela() << endl;
samochod.zmien_marke("Citroen");
samochod.zmien_cylindry(250);
samochod.zmien_wlasciciela("Artur");
cout << "Samochod - " << samochod.odczytaj_marke() << endl;
cout << "Samochod - " << samochod.odczytaj_cylindry() << endl;
cout << "Samochod - " << samochod.odczytaj_wlasciciela() << endl;
cout << "Opisana - " << opisana.odczytaj_marke() << endl;
cout << "Opisana - " << opisana.odczytaj_cylindry() << endl;
cout << "Opisana - " << opisana.odczytaj_wlasciciela() << endl;
cout << "Bardziej - " << bardziej.odczytaj_ladownosc() << endl;
cout << "Bardziej - " << bardziej.odczytaj_mase() << endl;
ciezarowka.zmien_marke("Man");
ciezarowka.zmien_ladownosc(505.4);
ciezarowka.zmien_mase(400);
cout << "Ciezarowka - " << ciezarowka.odczytaj_marke() << endl;
cout << "Ciezarowka - " << ciezarowka.odczytaj_ladownosc() << endl;
cout << "Ciezarowka - " << ciezarowka.odczytaj_mase() << endl;
return 0;
}
Po próbie kompilacji programu wylatują tony niezrozumiałych błędów, przykładowo:
program.cpp59: error: no matching function for call to ‘car::samochod(int, int, int)’
program.cpp59: note: candidates are:
samochod.h3: note: car::samochod(const car::samochod&)
samochod.h3: note: candidate expects 1 argument, 3 provided
samochod.h3: note: car::samochod(std::string, int, car::osoba)
samochod.h3: note: no known conversion for argument 3 from ‘int’ to ‘car::osoba’
samochod.h3: note: car::samochod()
samochod.h3: note: candidate expects 0 arguments, 3 provided
std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*)
osoba.h19: note: std::ostream& car::operator<<(std::ostream&, car::osoba&)
osoba.h19: note: no known conversion for argument 2 from ‘car::osoba’ to ‘car::osoba&’
program.cpp13: error: request for member ‘zmien_marke’ in ‘ciezarowka’, which is of non-class type ‘car::ciezarowy()’
Gdzie popełniłem błędy? Z doświadczenia wydaje mi się, że popełniłem jeden głupi, drobny błąd, a tylko brzmi to groźnie...