undefined reference to et non virtuelle thunk à
J'ai de telles classes:
class Product
{
public :
virtual double getPrice();
virtual void setPrice(double price);
};
class MusicProduct
{
protected:
string author;
double price;
public :
virtual string getAuthor();
virtual void setAuthor(string author);
~MusicProduct();
};
class CD : public MusicProduct, public Product
{
public :
string getAuthor();
void setAuthor(string author);
double getPrice();
void setPrice(double price);
};
string CD::getAuthor()
{
return MusicProduct::author;
}
void CD::setAuthor(string author)
{
MusicProduct:author = author;
}
void setPrice(double price)
{
MusicProduct::price = price;
}
double getPrice()
{
return MusicProduct::price;
}
Et j'ai ces erreurs:
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool MusicStore::hasProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|15|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual Product MusicStore::getProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|20|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool MusicStore::buyProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|25|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/MusicStore.cpp||In member function ‘virtual bool MusicStore::returnProduct( Product)’:|
/home/katie/Desktop/Temp/MusicStore.cpp|30|warning: no return statement in function returning non-void [-Wreturn-type]|
/home/katie/Desktop/Temp/Store/CD.cpp||In member function ‘virtual void CD::setAuthor(std::string)’:|
/home/katie/Desktop/Temp/Store/CD.cpp|12|warning: label ‘MusicProduct’ defined but not used [-Wunused-label]|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for CD]+0x10)||undefined reference to ` CD::getPrice()'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for CD]+0x14)||undefined reference to ` CD::setPrice(double)'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for CD]+0x20)||undefined reference to `non-virtual thunk to CD::getPrice()'|
obj/Debug/Store/CD.o:(.rodata._ZTVN5Music2CDE[vtable for CD]+0x24)||undefined reference to `non-virtual thunk to CD::setPrice(double)'|
obj/Debug/Store/CD.o:(.rodata._ZTIN5Music2CDE[typeinfo for CD]+0x10)||undefined reference to `typeinfo for MusicProduct'|
obj/Debug/Store/CD.o:(.rodata._ZTIN5Music2CDE[typeinfo for CD]+0x18)||undefined reference to `typeinfo for Product'|
||=== Build finished: 6 errors, 5 warnings ===|
Quel est le problème avec ce code?
OriginalL'auteur Katie | 2013-02-04
Vous devez vous connecter pour publier un commentaire.
Outre le manque de CD:: qualificatif d'erreur mentionné par momogentoo, c'est un autre très sournois erreur:
Depuis que vous avez utilisé un seul colon, il n'est pas interprété comme l'opérateur de résolution, mais comme une étiquette (pour les gotos). Ce que l'état va réellement faire, c'est juste de l'auto-affectation pour le même objet string (std::string n'aura aucun effet).
Il suffit de changer dans un double deux-points:
MusicProduct::author = author;
Il suffit de frapper ce message d'erreur. Jamais pensé à elle et il s'en alla avec un
make clean
, donc je suppose que juste obsolètes les fichiers objet.OriginalL'auteur user1610015
Premier problème:
Votre définition de cette fonction est manquante à l'
CD::
de qualification; donc au lieu déclare et définit un non-membre de la fonction.De même pour
CD::setPrice
.Deuxième problème:
Sans doute,
MusicProduct
est censé être une classe abstraite, et vous ne voulez pas de fournir des définitions ses fonctions virtuelles. Dans ce cas, vous devez les déclarer virtuelle pure:Si ce n'est pas censé être abstrait, alors vous aurez besoin de mettre en œuvre ces fonctions.
Troisième problème:
Sans doute, vous avez une fonction appelée
MusicStore::hasProduct
qui est censé renvoyer un booléen, mais ne le fait pas.class MusicStore{ public: void addProduct(Product p);};
est-il un moyen pour résoudre ce problème?Si vous souhaitez utiliser le polymorphisme à tous, alors vous aurez à passer une référence (
Product & p
) ou un pointeur (Product * p
). Même si ce n'était pas abstraite, de la tentative de copie, il sera presque certainement vous donner un comportement incorrect en raison de la découpage problème; il est donc préférable de quitter la classe de base abstraite et ne pas essayer de copier des objets.OriginalL'auteur Mike Seymour
vide setPrice(double prix) -> void CD::setPrice(double prix)
même pour getPrice()
OriginalL'auteur momogentoo