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