• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziedziczenie - Edycja zmiennej z klasy bazowej + błąd no appropriate default constructor available

Object Storage Arubacloud
0 głosów
126 wizyt
pytanie zadane 30 grudnia 2016 w C i C++ przez Jedyn Obywatel (1,200 p.)

Witam napisałem sobie program Samochod który oblicza spalanie,trasę itd. Teraz muszę stworzyć klasę która dziedziczy z klasy Samochod. Nowo stworzona klasa w sekcji private ma mieć pole logiczne dach_otwarty którego wartość ustawiona jest w konstruktorze na false. Oraz 2 metody Otwórz_dach oraz Zamknij_dach. Przy otwartym dachu spalanie samochodu wzrasta o 15%. Jak mogę dostać się do zmiennej zuzycie z metody jedz , żeby zwiększyć to spalanie przy otwartym dachu o 15%?
Kolejnym problemem jest error "no appropriate default constructor available" po stworzeniu klasy dziedziczącej TKabriolet. Czytałem ,że trzeba ustawić konstruktor na default ale nie za bardzo wiem jak to zrobić.
KOD: 

PLIK TSamochod.h

class TSamochod
{				
public:			
	TSamochod(std::string marka, float pB, float pM, float zP);
	void jedz(float jakSzybko, float jakDaleko);
	~TSamochod();
private:
	std::string m_marka;
	float m_pB;
	float m_pM;
	float m_zP;
};


PLIK TSamochod.cpp


TSamochod::TSamochod(std::string marka=" ", float pB=0, float pM=0, float zP=0)
{
	if (pM < 1 || pB <1 || zP < 1)
	{
		std::cout << "Bledne wartosci ";
		return;
	}
	else
	{
		m_marka = marka;
		m_pB = pB;
		m_pM = pM;
		m_zP = zP;
	}
}

void TSamochod::jedz(float jakSzybko, float jakDaleko)
{	
	int ilePrzerw = 0;
	int zuzycie=0;
	int czas=0;
	int predkosc = 0;
	if (jakSzybko > 0)		//sprawdzamy czy dane sa poprawne
		{
			if (m_pM > jakSzybko)		//sprawdzamy czy predkosc nie przekracza maksimum
			{	
				predkosc = jakSzybko;
					//jezeli nie to ja wyswietlamy
			}
			else 
			{
				predkosc = m_pM;
			}
			//jezeli tak to wyswietlamy maksimum
		}		
		
		          //pB - pojemnosc baku, zP zuzycie paliwa
	
	zuzycie = jakDaleko / 100 * m_zP;
	int szybkosc = jakSzybko;
	
	for(int i=zuzycie;i>m_pB;i-=m_pB)
	{
		ilePrzerw++;
		czas += 10;
		
	}
	
	czas += (jakDaleko / predkosc)*60;

	if (predkosc < (m_pM / 100) * 30 || predkosc> (m_pM/100)*80)			//jezeli predkosc mniejsza od 30% predkosci maksymalnej lub wieksza od 80% predkosci maksymalnej
	{
		zuzycie = (zuzycie *1.2);
	}
	std::cout << "Samochod pojedzie z predkoscia: " << predkosc <<"km/h"<< " zuzyje " << zuzycie << " litrow paliwa " << " bedzie musial tankowac " << ilePrzerw << " razy " << " . Cala podroz zajmie: " << czas <<" minut"<<std::endl;
}
//20min tankowanie + 150min jazda


TSamochod::~TSamochod()
{
}




KLASA DZIEDZICZACA TKabriolet.h



#include "TSamochod.h"
class TKabriolet :
	protected TSamochod
{
public:
	TKabriolet(bool dach_otwarty);

	~TKabriolet();
private:
	bool m_dach_otwarty;
};



KLASA DZIEDZICZACA TKabriolet.cpp

#include "stdafx.h"
#include "TKabriolet.h"






TKabriolet::TKabriolet(bool dach_otwarty)
{    <-------------------tutaj swieci sie na czerwono i wyskakuje blad "no default constructor exist for class "TSamochod"
}

TKabriolet::~TKabriolet()
{
}

 

2 odpowiedzi

+1 głos
odpowiedź 31 grudnia 2016 przez criss Mędrzec (172,590 p.)
wybrane 31 grudnia 2016 przez Jedyn
 
Najlepsza

Jak mogę dostać się do zmiennej zuzycie z metody jedz , żeby zwiększyć to spalanie przy otwartym dachu o 15%? 

Nie możesz... To zmienna lokalna i istnieje tylko w tej metodzie (podczas jej "działania").  Musisz to napisać inaczej. Np. dodać pole klasy będące mnożnikiem spalania... Cokolwiek - twoja inwencja.

Kolejnym problemem jest error "no appropriate default constructor available" po stworzeniu klasy dziedziczącej TKabriolet.

Zdefiniowales jakis kosntruktor TSamochod, więc domyslny (bezargumentowy) nie zostal utworzony. Musisz przekazać jakieś argumenty do konstruktora TSamochod. Np.: 

TKabriolet::TKabriolet(bool dach_otwarty) : TSamochod("opel", 1, 1, 1)
{    
}

Ale oczywiscie lepiej by bylo zeby mozliwe bylo podanie z zewnatrz wartosci argumentow...

TKabriolet::TKabriolet(std::string s, float a, float b, float c, bool dach_otwarty) 
: TSamochod(s, a, b, c),
   m_dach_otwarty(dach_otwarty)
{    
}

Btw. fajnie by było zeby w TSamochod zamiast private było protected. Inaczej klasa dziedzicząca (TKabriolet) nie ma do nich dostępu.

komentarz 31 grudnia 2016 przez Jedyn Obywatel (1,200 p.)
Dzięki wielkie za podpowiedzi. W zadaniu niestety mam ,że konstruktor musi ustawiać wartości w klasie TSamochod. Czyli dając protected będę miał dostęp do wartości zadeklarowanych w klasie TSamochod private?
komentarz 1 stycznia 2017 przez criss Mędrzec (172,590 p.)
Jeśli zamienisz private ma protected - tak.
0 głosów
odpowiedź 31 grudnia 2016 przez niezalogowany

Wpisz w ciało tej klasy

TKabriolet(){}

i powinno być ok

komentarz 31 grudnia 2016 przez criss Mędrzec (172,590 p.)
Będzie sie kompilować. I na tym się kończy "ok". Pola TSamochod nie zostana w zaden sposob zainicjalizowane.

Podobne pytania

0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 15 października 2016 w C i C++ przez timrh Mądrala (6,030 p.)
0 głosów
2 odpowiedzi 1,004 wizyt
pytanie zadane 22 kwietnia 2016 w C i C++ przez kkkk Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 330 wizyt

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...