Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

problem z čiste virtualnymi funkciami

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: problem z čiste virtualnymi funkciami

Autor: Fredy Pumpicka

12:34:54 03.03.2008

Kua ... ja dycky nez to sesmolim, tak me predbehnou (a este to vypada, ze opisuju :-)) )

Citovat příspěvek

 

Re: problem z čiste virtualnymi funkciami

Autor: Fredy Pumpicka

11:56:27 03.03.2008

Ja to normalne prelozim. Jedine co me napada, ze jsi v amarok.cpp pred is_running nedal player_amarok::
(predpokladam, ze jsi to kopiroval a mohlo ti to vypadnnout). Jinak neni duvod, aby to neslapalo.

Fredy "KRUGER" Pumpicka

Citovat příspěvek

 

Re: problem z čiste virtualnymi funkciami

Autor: ondra.holub

11:37:28 03.03.2008

Opravdu máš tu metodu implementovanou? Ta chyba říká, že metoda je deklarovaná, ale není definovaná. Mně se to obvykle stane tehdy, když zapomenu metodu definovat jako metodu třídy, ale nechám to jako obyčejnou funkci (copy and paste error):

[code]int player_amarok::is_running() // Máš tady player_amarok:: ?
{
return 0;
}[/code]

Citovat příspěvek

 

problem z čiste virtualnymi funkciami

Autor: sidewalk

8:27:51 03.03.2008

Mám tento kód

player.h --> slúži ako definícia API pre ostatné triedy - konkrétne prehrávače
[code]
#ifndef PLAYER_H
#define PLAYER_H

#include

class player{
public:
virtual std::string get_title(void) = 0;
virtual std::string get_artist(void) = 0;
virtual std::string get_time_string(void) = 0;
virtual unsigned long long int get_time_ms(void) = 0;
};

#endif
[/code]

Tu je príklad zatiaľ jediného podporovaného prehrávača amarok.h- neskôr budú aj dalšie
[code]
#ifndef AMAROK_H
#define AMAROK_H

#include "player.h"

class player_amarok : public player{
public:
std::string get_title(void);
std::string get_artist(void);
std::string get_time_string(void);
unsigned long long int get_time_ms(void);
};

#endif
[/code]
Všetky funkcie sú v amarok.cpp aj implementované. [bold]Problém nastane keď pridám ďalšiu čiste virtuálnu f-ciu "int is_running(void) = 0;" takže kód vyerá takto[/bold]:
[code]
#ifndef PLAYER_H
#define PLAYER_H

#include

class player{
public:
virtual std::string get_title(void) = 0;
virtual std::string get_artist(void) = 0;
virtual std::string get_time_string(void) = 0;
virtual unsigned long long int get_time_ms(void) = 0;
[bold] virtual int is_running(void) = 0;[/bold]
};

#endif
[/code]
a
[code]
#ifndef AMAROK_H
#define AMAROK_H

#include "player.h"

class player_amarok : public player{
public:
std::string get_title(void);
std::string get_artist(void);
std::string get_time_string(void);
unsigned long long int get_time_ms(void);
[bold] int is_running(void);[/bold]
};

#endif
[/code]
kompilujem to príkazom:
g++ -c -o amarok.o amarok.cpp
g++ -c -o main.o main.cpp
a linkujem:
g++ -o exec main.o xwindow.o players/amarok.o -O3 -L. -lSPL -lconfig++

V main si predstavte len to že vytvorím objekt typu amarok a volám get_title a ostatné okrem is_running().

Prvý príklad bez is_running sa skompiluje aj zlinkue vporiadku. Problém nastane po pridaní tej funkcie, keď potom linker vyhlási takúto chybu:
[code]
main.o: In function `main':
main.cpp:(.text+0x1168): undefined reference to `vtable for player_amarok'
collect2: ld returned 1 exit status
[/code]

Funkcia is_running() je samozrejme v amarok.cpp implementovaná tiež. Fakt nerozumiem kde by mohla byť chyba. Keď isrunning odstranim tak sa to zasa skompiluje vporiadku.
Skúšal som sa na to pozrieť aj v midnight kommanderi a je pravda ze ked otvorim amarok.o skompilovany s is_running() tak tam vtable položky chýbajú. Keď is_running odstránim vtable položky sa tam znova objavia.

PLEASE HELP ME :S

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: