wojownik266 Temat założony przez niniejszego użytkownika |
[c++] Dziedziczenie i inicjalizacja konstruktorem klasy bazowej » 2017-05-14 22:12:02 Czy istnieje jakiś sposób na zainicjalizowanie zmiennych a1 i b1, klasy pochodnej konstruktorem (listą inicjalizującą) klasy bazowej? W swoich rozwazaniach na ten temat doszedłem do takiego programu i dalej ani rusz…. Ma ktoś jakiś pomysł na rozwiazanie tego problemu? #include <iostream> using namespace std;
class A { protected: int a; int b; public: A( int n, int m ); ~A(); void show_value(); }; A::A( int n, int m ) : a( n ) , b( m ) { } A::~A() { } void A::show_value() { cout << "A:" << a << endl; cout << "B:" << b << endl; } class B : public A { public: int a1; int b1; public: B( int n, int m ); ~B(); void show_value(); }; B::B( int n, int m ) : A( a, b ) { } B::~B() { } void B::show_value() { cout << "A1:" << a1 << endl; cout << "B1:" << b1 << endl; } int main() { A an( 10, 10 ); an.show_value(); B ba( 5, 5 ); ba.show_value(); cin.get(); return 0; }
|
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2017-05-14 22:27:38 Ta inicjalizacja ma się odbyć w tym miejscu: B::B( int n, int m ) : A( a, b ) { }
|
|
latajacaryba |
» 2017-05-14 23:13:00 Chyba nie rozumiem, chcesz, by zmiennych a1 i b1, klasy pochodnej konstruktorem (listą inicjalizującą) klasy bazowej? |
lista inicjalizująca konstruktora klasy bazowej wiedziała, jakie zmienne trzymasz w klasie pochodnej? W ogóle skąd tutaj: B::B( int n, int m ) : A( a, b ) { }
'a' i 'b'? To jakieś zmienne, skąd konstruktor ma je wziąć? Nie chodziło Ci czasem o to: B::B( int n, int m ) : A( n, m ) { }
|
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2017-05-15 05:17:57 W bardzo dużym uproszczeniu chodzi mi o taką inicjalizację: B::B( int n, int m ) : A( B::a1, B::b1 ) { }
Tylko w tym problem że tak się pewnie nie da zrobić... A poza tym jeszcze nie za bardzo rozumiem o co chodzi w tym kawałku kodu: B::B( int n, int m ) : A( a, b ) { }
Moim zdaniem ten konstruktor klasy Bazowej A A( a, b ) nic nie robi a powinien coś robić. Tak mi się przynajmniej wydaje i byłbym bardzo wdzięczny gdyby ktoś mi objaśnił co on w tym kawałku kodu właściwie robi? |
|
karambaHZP |
» 2017-05-15 05:42:17 Jakimi wartościami zainicjalizowane są pola a1 i b1? B::B( int n, int m ) : A( B::a1, B::b1 ) { }
Wychodzi na to, że chcesz aby pola klasy A i B miały te same wartości. Choć nie widzę sensu w takim działaniu. Jeśli mają być takie same to korzystaj tylko z pól klasy A. Klasa B je dziedziczy więc nie ma potrzeby w klasie B umieszczać dokładnie tego samego. Moim zdaniem ten konstruktor klasy Bazowej A A( a, b ) nic nie robi a powinien coś robić. |
Kompilator nie wie co to jest a i b w odniesieniu do tego konstruktora, co już było powiedziane. Co twoim zdaniem ma robić wywołanie konstruktora? |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2017-05-15 05:50:04 Moim zdaniem wywołanie konstruktora powinno nadać wartości zmiennym np a i b; |
|
karambaHZP |
» 2017-05-15 06:41:50 Co chcesz osiągnąć? Nie ma sensu dziedziczyć jeśli w obu klasach używasz takich samych pól. class A { protected: int a; public: A( int n ) : a { n } { } };
class B : public A { int b; public: B( int na, int nb ) : A( na ) , b { nb } { } void show_ab() { std::cout << this->a << ' ' << this->b << std::endl; } };
int main() { B b_obj( 2, 4 ); b_obj.show_ab(); } |
|
latajacaryba |
» 2017-05-15 09:28:59 Tylko w tym problem że tak się pewnie nie da zrobić... A poza tym jeszcze nie za bardzo rozumiem o co chodzi w tym kawałku kodu:
B::B( int n, int m ) : A( a, b ) { }
|
To konstruktor klasy B. Klasa b zawiera zmienne z klasy A oraz swoje wlasne czyli Int a,b, a1, b1. W konstruktorze klasy B (lista inicjalizacyjna) wywolujesz konstruktor klasy A (inicjalizuje on zmienne a oraz b czyli wykonuje "swoja czesc roboty", w koncu odpowiada on za klase A z ktorej dziedziczy B.). natomiast nie bardzo rozumiem Twojego zapisu z tego wzgledu, ze na liscie inicjalizacyjnej B konstruktor A przyjmuje argumenty a i b które nie są nigdzie przesylane. Ja bym to zrobil tak: B::B( int n, int m, int a, int b ) : A( a, b ) { a1 = n; b1 = m; }
To a1 i b1 tez mozesz inicjalizowac na liscie. |
|
« 1 » 2 |