Nie rozumiem konstruktora

0

Cześć, piszę swój drugi program w obiektówce c++ i mam pewien problem, z którym nie mogę sobie poradzić.
Mam dwie klasy - urządzenie i szlifierka kątowa. Chciałbym, żeby część danych z konstruktora "urządzenia" była dziedziczona w szlifierce i z jakiś względów nie mogę tego zrobić.
Udostępniam kod:

#include <iostream>
#include <string>
#include <math.h>
using namespace std;


class Urzadzenie {

protected:
	string firma;
	int obroty;

public:
	string daj_firme()
	{
		return firma;
	}
	int daj_obroty() {
		return obroty;
	}
	
	void pokaz_opis() {
		cout <<"Nazwa firmy: "<< daj_firme() << endl;
		cout <<"Ilosc obr. na minute: "<< daj_obroty() << endl;
	}

	Urzadzenie(string nazwa = "Bosh", int obr = 3500) {
		firma = nazwa;
		obroty = obr;
	}

};

class SzlifierkaKatowa:protected Urzadzenie {
	int moc;
	int tarcza;

public:
	int daj_moc() {
		return moc;
	}
	int daj_tarcze() {
		return tarcza;
	}
	void pokaz_opis() {
	Urzadzenie::pokaz_opis();
	cout << "Moc: " << daj_moc() <<"W"<< endl;
	cout << "Tarcza: " << daj_tarcze() << "mm" << endl;
	}
	
	SzlifierkaKatowa(string nazwa="aa", int obr=1, int _moc = 850, int srednica = 140)
		:Urzadzenie(nazwa, obr) {
		moc = _moc;
		tarcza = srednica;
	}

};

int main() {

	SzlifierkaKatowa p1;
	p1.pokaz_opis();
	

	cin.get();
	cin.ignore();

	return 0;
}

Chodzi mi konkretnie o fragment

SzlifierkaKatowa(string nazwa="aa", int obr=1, int _moc = 850, int srednica = 140)
		:Urzadzenie(nazwa, obr) {
		moc = _moc;
		tarcza = srednica;

W takim układzie po użyciu funkcji pokaz_opis() wyrzuca mi dane
firma="aa"
obr = "1"
Natomiast ja bym chciał, żeby te dane były odziedziczone po klasie urządzenie, czyli Bosh i 3500.
Co robię źle? :/

1

Nie rozumiem w czym problem. Tworzysz obiekt klasy dziedziczącej, przekazujesz nazwę i obr, więc domyślne nie będą użyte. Jak chcesz jakieś konkretne wartości to je podaj.

1

SzlifierkaKatowa p1; tu tworzysz obiekt używając domyślnych wartości parametrów konstruktora klasy SzlifierkaKatowa, czyli string nazwa="aa", int obr=1, .... I te parametry podajesz dalej do konstruktora Urzadzenie.

0
kq napisał(a):

Nie rozumiem w czym problem. Tworzysz obiekt klasy dziedziczącej, przekazujesz nazwę i obr, więc domyślne nie będą użyte. Jak chcesz jakieś konkretne wartości to je podaj.

Chciałbym, żeby każdy dziedziczony obiekt po klasie urządzenie miał domyślne wartości nazwa=Bosh i obr=3500, tak żebym nie musiał ich deklarować za każdym razem. Jeżeli w podanym fragmencie usunę "aa" i "1" to wyrzuci mi błąd, że konstruktor nie ma domyślnych wartości.

@Edit
Precyzując, chodzi mi o dziedziczenie domyślnych wartości. Tworząc klasę urządzenie podaje że nazwa=Bosh i obr=3500 i chce na tym bazować tworząc kolejne klasy.

0

W takim przypadku możesz:

  1. Nie brać tych parametrów w ogóle i używać domyślnego konstruktora Urzadzenie
  2. Zdefiniować osobny domyślny konstruktor klasy dziedziczącej i w nim zastosować powyższe.
0
kq napisał(a):

W takim przypadku możesz:

  1. Nie brać tych parametrów w ogóle i używać domyślnego konstruktora Urzadzenie
  2. Zdefiniować osobny domyślny konstruktor klasy dziedziczącej i w nim zastosować powyższe.

No właśnie, chodzi o to, że zaznaczony przeze mnie fragment kodu jakby "nie działa"
screenshot-20180423012415.png

Jeżeli usunę "aa" i "3500" to nie odziedziczy ich po konstruktorze Urzadzenie, tylko wyrzuci błąd, że nie mam domyślnych wartości konstruktora.

1

To, tak jak piszę, nie przekazuj wartości do konstruktora Urzadzenie, skoro nie chcesz z nich korzystać.

SzlifierkaKatowa(int _moc = 850, int srednica = 140){
        moc = _moc;
        tarcza = srednica;
0
kq napisał(a):

To, tak jak piszę, nie przekazuj wartości do konstruktora Urzadzenie, skoro nie chcesz z nich korzystać.

SzlifierkaKatowa(int _moc = 850, int srednica = 140){
        moc = _moc;
        tarcza = srednica;

Ok dzięki, to działa, ale jeszcze nie jest tym co chciałem do końca uzyskać. W takim wypadku nie mogę później w żaden sposób zmienić np. nazwy przy tworzeniu obiektu. Da radę to zrobić tak, żeby dziedziczył wartości domyślne po urządzeniu, jednocześnie dając możliwość zmiany tych wartości przy tworzeniu obiektu?

1

Tak, opcja 2 z wymienionych.

SzlifierkaKatowa() { moc = 850; tarcza = 850; }

SzlifierkaKatowa(string nazwa, int obr, int _moc = 850, int srednica = 140)
        :Urzadzenie(nazwa, obr) {
        moc = _moc;
        tarcza = srednica;
0
kq napisał(a):

Tak, opcja 2 z wymienionych.

SzlifierkaKatowa() { moc = 850; tarcza = 850; }

SzlifierkaKatowa(string nazwa, int obr, int _moc = 850, int srednica = 140)
        :Urzadzenie(nazwa, obr) {
        moc = _moc;
        tarcza = srednica;

Bardzo dziękuję, chociaż teraz nie wiem czemu to działa :D.

SzlifierkaKatowa() { moc = 850; tarcza = 850; }

W takim układzie bez tej linijki wyrzuca błąd. Dlaczego? Jakie powiązanie ma zadeklarowanie zmiennych moc i tarcza na dziedziczenie nazwy i obrotów z urzadzenia?

0

Masz dwa konstruktory. Jeden przyjmuje wszystkie wartości, drugi żadnych - jest domyślny.

0
kq napisał(a):

Masz dwa konstruktory. Jeden przyjmuje wszystkie wartości, drugi żadnych - jest domyślny.

Okej, czyli tak na prawdę mogę to równie dobrze zapisać w ten sposób?

SzlifierkaKatowa() { moc = 850; tarcza = 140; }

	SzlifierkaKatowa(string nazwa, int obr, int , int )
		:Urzadzenie(nazwa, obr) {
		
	}
1

Tak.

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