Linker nie odnajduje czegoś

0

Witam serdecznie: otrzymuję serię komunikatów:
[Linker error] undefined reference to `Item::Pointer(int)'

Program jest pisany ze szczególnym wykorzystaniem polimorfizmu i błąd tyczy się fragmentu gdzie:

 WSK->Show(WSK->Pointer(decyzja)); 

gdzie Pointer, to funkcja zwracająca wskaźnik na n-ty (wybrany przez użytkownika) obiekt listy.

Book *Book::Pointer(int wybor)
{
     Book *temp=Start;
     int i;
     for(i=1; i<wybor; i++) temp=temp->Next;
     return temp;
}

Z góry dziękuję za pomoc

0

za mało pokazałeś. na przykład: dlaczego błąd dotyczy Item::Pointer(int), a pokazałeś Book::Pointer(int)? w jaki sposób te klasy są powiązane?
co jest parametrem metody Show()?

0

Na oko obstawiam brak virtual.

0

Klasa Book dziedziczy po Item. W item zdefiniowałem:

...
Item virtual *Pointer(int Google);
void virtual Show(Item *point);
...

zaś w klasie Book:

...
 Book *Pointer(int Google);
void Show(Book *point);
...
0
Vardens napisał(a)
...
Item virtual *Pointer(int Google);
void virtual Show(Item *point);
...

Dziwny zapis, do tej pory wydawało mi się, że deklaracja metody virtualnej powinna być "poprzedzona słowem kluczowym virtual" ("...we must precede its declaration with the keyword virtual") <a href="http://www.cplusplus.com/doc/tutorial/polymorphism/">źródełko</a>
0

Szczerze: korzystam z funkcji wirtualnych 2-3. raz w życiu i też dawałem virtual przed typem funkcji. Teraz nie działało i myślałem, że coś jest nie tak, to sprawdziłem w Symfonii, tam jest właśnie po typie. A że jestem w desperacji, to pozmieniałem, niestety: nic nie pomogło...

0

daj lepiej całe nagłówki tych klas

0

Błąd sugeruje, że metoda Pointer w klasie bazowej (Item) nie jest czysto wirtualna, linker szuka jej ciała, które nie zostało zdefiniowane.

class Item {
    // ...
    virtual Item *Pointer(int) = 0;
    // ...
);

Powinno starczyć.

0
class Item
double Price;
public:
virtual Item *Pointer(int Google=0){};
       void virtual Add(){};
	   void virtual Show(Item *point);
	   void virtual Deleter(Item *point);

Klasa bazowa.

Klasa Book:

class Book: public Item
{
      
      Book *Next, *Prev;
      Book  *Start, *End;
	
public:
       Book *Pointer(int Google);
       Book(){Start=End=NULL;};
	   ~Book(){czysc();};
       void Add();
	   void Show(Book *point);
	   void Deleter(Book *point);

Definicja Pointera:

Book *Book::Pointer(int Google)
{
     Book *temp=Start;
     int i;
     for(i=1; i<Google; i++) temp=temp->Next;
     return temp;
}

Definicja np: Show

void Book::Show(Book *point)
{
	cout<<endl<<"Ksiazka pt. " <<point->Name<<" przez wydawce opisana: "<<point->Plot<<" CENA: " <<point->Price;
}

Oraz zastosowanie metod w programie:

Arrow=&Biblioteka;
Arrow->ShowAll();
 cout<<endl<<endl<<"Ktora ksiazke chcesz wybrac? (Podaj nr): ";
cin>>decyzja;
                                                     
Arrow->Show(Arrow->Pointer(decyzja));

Kod błędu:
[Linker error] undefined reference to `vtable for Item'

0

Jak zrobisz tak:

void virtual Show(Item *point);
//
void Show(Book *point);

to polimorfizm NIE ZADZIAŁA, bo sygnatury funkcji są RÓŻNE.

0

Przeczytaj mój post JESZCZE RAZ i zrób to, co pokazałem ze wszystkimi metodami wirtualnymi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1