Napisał
Rolek
"
Prostokat jest rodzajem Dzialania."
Jeśli na liście inicjalizacyjnej konstruktora klasy pochodnej nie podasz z jakimi argumentami ma być wywołany konstruktor klasy bazowej, to domyślnie jest wywoływany
konstruktor domyślny, czyli taki, który nie przyjmuje żadnych argumentów.
Trywialny konstruktor domyślny jest tworzony niejawnie tylko wtedy gdy nie zdefiniujesz żadnego innego.
Jeśli wszystkim argumentom jakiegoś konstruktora ustawisz wartości domyślne to może być on wtedy używany jako konstruktor domyślny, bo może być wywołany bez podawania argumentów.
ok, ale nadal nie rozumiem dlaczego w tym przykadzie musze od razu podac te wartosci w funkcji: Dzialania(int a=3,int b=2), a nie moge wywolac konstruktora z poczatkowymi wartosciami w funkcji main.
Jaki problem? Nie napisałaś czemu ten program ma służyć.
Podałaś tylko problem
implementacyjny. Czasem wprowadza się poprawki do modelu obiektowego ze względu na trudności implementacyjne, ale powinny to być zmiany sensowne.
Dopiero zaczynam naukę i nie mam jeszcze pomysłu na stworzenie jakiegoś projektu, stąd take dziwne przykłady.
Probowalam to jeszcze zrobic bez dziedziczenia klasy w taki sposob:
Kod:
#include <iostream>
using namespace std;
class Dzialania
{
private:
int x,y;
double z1,z2;
public:
Dzialania(int,int);
void dzial();
double Z1() {return z1;}
double Z2() {return z2;}
};
Dzialania::Dzialania(int a,int b)
{
x=a;
y=b;
}
void Dzialania::dzial()
{
z1=x*y;
z2=x+y;
cout<<"z1 = "<<z1<<"\n";
cout<<"z2 = "<<z2<<"\n";
}
class Prostokat
{
private:
int m,n;
public:
Prostokat(int, int);
int pole() {return Dzialania(m,n).Z1()*Dzialania(m,n).Z2();}
};
Prostokat:: Prostokat(int a,int b)
{
m=a;
n=b;
}
int main()
{
Dzialania D(2,3);
D.dzial();
cout<<"sprawdzam "<<D.Z1()<<endl;;
Prostokat a(2,2);
cout << "Pole prostokata a = " << a.pole() << '\n';
}
Tak jak wcześniej napisałes Z1 i Z2 nic nie zwraca, więc nie ma opcji, by to działało poprawnie. Gdzieś trzeba wywolac funkcje dzial() z klasy Dzialania.