Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Klasy] Błąd: 'undefined to reference'

Ostatnio zmodyfikowano 2010-03-23 18:25
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
[C++, Klasy] Błąd: 'undefined to reference'
» 2010-03-22 21:26:22
C/C++
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...
P-15352
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.
P-15353
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...
P-15356
malan
» 2010-03-22 22:03:38
C/C++
#include <iostream>
using namespace std;

class foo_1
{
    int a, b, c;
   
public:
    foo_1();
    foo_1( int, int, int );
};

foo_1::foo_1()
// Ciałko ===>
{
    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 :).
P-15358
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:
C/C++
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;
};
P-15361
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
P-15369
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....
P-15370
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.
P-15374
« 1 » 2
  Strona 1 z 2 Następna strona