Klasy wywiedzione i program testujący

0

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...

1

Nie ma to jak wyprodukować setki linii kodu i nie próbować tego kompilować...
Tu jest błąd:

 samochod samochod, opisany('Lamborghini', 300, 'Krzysiek');

bo stringi trzymamy w " " a nie ' '
Kolejne błędy:

samochod samochod;
samochod opisany("Lamborghini", 300, osoba("Krzysiek"));

NIE nazywamy obiektów tak samo jak klasy! string "Krzysiek" to nie to samo co osoba stworzona z argumentem konstruktora "Krzysiek"...

ciezarowy opisana("MAN", 200, osoba("Krzysiek"));

WTF? Ja nie widze konstruktora ciężarówki z takimi argumentami...

cout << "Opisany - " << opisany.oczytaj_wlasciciela() << endl;

Ty to piszesz lodówką że ci nie podpowiada że nazwa metody jest zła? o_O

0

to samo (niektore bledy zniknely, ale wciaz jest ich cala dluga lista). Przykładowy (chyba nowy):
program.cpp59: error: no matching function for call to ‘car::samochod(const char [12], int, const char [9])’

0

http://4programmers.net/Pastebin/1666
Będzie wisialo przez godzinę.

0

Dziękuję za pomoc:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1