dmx81 Temat założony przez niniejszego użytkownika |
[C++, Klasy] Błąd: 'undefined to reference' » 2010-03-22 21:26:22 class C_poziom1 { public: int i_x, i_y, i_s, i_w; bool b_disp; BITMAP * obrazek; C_poziom1(); C_poziom1( int x, int y, int s, int w ); }; C_poziom1::C_poziom1( int x, int y, int s, int w ) { i_x = x; i_y = y; i_s = s; i_w = w; } class C_ROZBITEK : public C_poziom1 { public: int pozycja_x, pozycja_y; C_ROZBITEK(); C_ROZBITEK( int x, int y, int s, int w ); };
C_ROZBITEK::C_ROZBITEK( int x, int y, int s, int w ) { i_x = x; i_y = y; i_s = s; i_w = w; }
undefined to reference 'C_poziom1::C_poziom1()' mam taki komunikat - jak widac probuje uzyc dziedziczenia klasy, robie to pierwszy raz, wiec nie wiem, co zrobilem zle - bo przed dopisaniem dziedziczenia, program dobrze dzialal. domyslam sie, ze cos z konstruktorem... ale nie wiem w sumie co, bo te zmienne, ktore ma konstruktor klasy dziedziczonej, to przechodza one z klasy bazowej i nie musze juz ich w klasie dziedziczonej wypisywac no nie? a te dopisane(nowe)zmienne w klasie dziedziczonej, to chyba nie ma wymogu deklarowania ich w konstruktorze? no i w sumie nie wiem, co robie zle... |
|
malan |
» 2010-03-22 21:35:22 Podpowiedź: Tworząc obiekt klasy C_poziom1 wywołujesz nie zdefiniowany (domyślny-jeśli można go tak nazwać) konstruktor. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-03-22 21:46:51 niestety nie rozumiem :( tzn rozumiem tresc, ale nie wiem jak mam przelozyc to na swoj przyklad. z tego co sie nauczylem, wiem, ze dobrze jest oprocz konstruktora zawierajacego w nawiasie jakies zmienne, utworzyc konstruktor bez zadnych zmiennych (sorry za "fachowe" okreslenia), wiec jak widac mam jeden i drugi - i tak bylo ciage w przypadku klasy bazowej, a obiekty tworzylem przez np: C_poziom1 obiekt(10,10,10,10);
teraz utworzylem nowa klase, pochodna do tej pierwszej, wiem, ze konstruktory nie sa dziedziczone, utworzylem wiec nowe, takie,jakie mi sa potrzebne do utworzenia obiektow... i niestety nie rozumiem, jak mam skorzystac z tej podpowiedzi... |
|
malan |
» 2010-03-22 22:03:38 #include <iostream> using namespace std;
class foo_1 { int a, b, c; public: foo_1(); foo_1( int, int, int ); };
foo_1::foo_1()
{ cout << "foo_1: Tu foo_1. Tworze." << endl; }
foo_1::foo_1( int ble, int ble1, int ble2 ) { cout << "foo_1: Tu foo_1(2). Tworze." << endl; }
class foo_2 : private foo_1 { int d, e, f; public: foo_2(); foo_2( int, int, int ); };
foo_2::foo_2() { cout << "foo_2: Tu foo_2. Tworze." << endl; }
foo_2::foo_2( int ble, int ble1, int ble2 ) { cout << "foo_2: Tu foo_2(2). Tworze." << endl; }
int main() { foo_2 oFoo( 1, 2, 3 ); getchar(); return 0; }; Ogólnie to Twój błąd polega na tym, że nie masz ciała konstruktora ;p. Dlaczego przy dziedziczeniu jest wywoływany konstruktor domyślny z klasy bazowej Ci nie powiem, bo nie wiem to raz, a dwa - nawet gdybym wiedział to Iname Ci lepiej wyjaśni :). |
|
Elaine |
» 2010-03-22 22:16:43 Przy dziedziczeniu wywoływany jest konstruktor domyślny klasy bazowej, ponieważ inne wymagają argumentów, a tych kompilator nie wyczaruje. W każdym razie można to zmienić, jawnie wywołując konstruktor klasy bazowej w konstruktorze klasy pochodnej: struct foo { foo( int x, int y ) : myX( x ) , myY( y ) { } int myX, myY; }; struct bar : foo { bar( int z ) : foo( 4, 8 ) , myZ( z ) { } int myZ; }; |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-03-22 23:05:31 1. czy argumentami musza byc liczby? skoro to dopiero "konstrukcja" - liczby wolalbym podawac dopiero przy tworzeniu obiektu (pewnie uzyc zmiennych zadeklarowanych w klasie bazowej?)
2.jak wyglada w tym przypadku tworzenie obiektu, tak samo jak poprzednio? tzn KLASA_POCHODNA obiekt(x,y,z)?
3.dlaczego mowa o "wyczarowaniu" argumentow, przeciez tworzac obiekt, ja te argumenty podaje (mowa o tych, ktore potrzebne sa kontruktorowi)
ja rozumiem, ze na pewno masz racje, ale nie do konca jeszcze rozumiem ten mechanizm, wiec nieco na oslep przepisuje podpowidzi, a wolalbym wiedziec od poczatku, co tak naprawde robie, dzieki za cierpliwosc |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-03-22 23:14:42 doszedlem do takiego wniosku, ze:
uzywajac dziedziczenia, klasa pochodna dziedziczy zmienne itd, ale ich nie wypisujemy w deklaracji zmiennych klasy pochodnej, sa jakby w pamieci, jesli chcemy ustalic ich wartosci przy tworzeniu obiektu, nalezy jak to napisales, jawnie dopisac konstruktor klasy bazowej, a konstruktor klasy pochodnej bedzie ustalal zmienne nowozadeklarowane
nie wiem ile sie w tym pomylilem, ale jakos chce sobie to poukladac
PS> problem rozwiazalem, poprzez dodanie {} do konstruktorow, nie rozumiem do konca tego, ale dziala poprawnie - moze gdzies doczytam, ewentualnie moze ktos rozwinie ta mysl, dlaczego tak musi byc a nie inaczej, ze co to zmienia w dziedziczeniu, ze dodalem {} do konstruktorow i juz smiga jak nalezy
czyli w tym przypadku dodalem to "puste" cialo, nie wiem jeszcze, kiedy nalezy stosowac zaproponowane tutaj jawne dopisywanie konstruktora klasy bazowej w klasie pochodnej i co dalej z tym robic.... |
|
Elaine |
» 2010-03-22 23:34:37 1. Nie muszą to być liczby - użyłem liczb, bo są krótkie :> 2. Tak. 3. Bo kompilator nie wie, skąd wziąć argumenty dla konstruktora klasy bazowej. Konstruktor klasy pochodnej co prawda może przyjmować nawet i takie same argumenty, ale kompilator ma to gdzieś - jak ma być wywołany konstruktor klasy bazowej z argumentami, to musisz tego zażądać w sposób jawny. |
|
« 1 » 2 |