• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ vector zawierający klasy , błędy przy kompilacji

Aruba Cloud - Virtual Private Server VPS
0 głosów
586 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Mala_Mysz Nowicjusz (120 p.)

Robię prostą grę w zgadywanki, gdzie mam główną klasę Zwierzeta, która zawiera virtual void get_prompt(); czyli podpowiedź. Po niej dziedziczą inne klasy, które zawierają coraz bardziej szczegółowe podpowiedzi aż do ostatniej klasy np Pingwin. Próbuję w main zrobić vector złożony z klas samych już gatunków zwierząt jak Koliber, Kura etc, ale wyskakują mi błędy. W pliku *.h z klasami zwierząt wszystko jest chyba ok. Błędy wyskakują w main:

undefined reference to 'Koliber::Koliber()'  etc

wczesniej próbowałam tak: zwierz.push_back(Koliber());  ale też wyskakiwały błędy. Nie wiem jak to ugryźć.

Drugie pytanie: wiecie może jak zrobić z vector'a klas randoma, który mi będzie losował jedną klase o podanej nazwie?

poniżej fragment main, #include wszystkie mam. Klas mam 20 z samymi gatunkami. Nie wrzucam wszystkich bo błąd się powtarza. 

#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
#include <ctime>
//#include <algorithm>
#include "zgadywanka.h"
#include <memory>

using namespace std;

int main(int argc, char* argv[])
{

//tworzenie wektora klasy bazowej

vector<shared_ptr<Zwierzeta>>zwierz;

shared_ptr<Pingwin>(new Pingwin);
shared_ptr<Kruk>(new Kruk);
shared_ptr<Koliber>(new Koliber);
shared_ptr<Kura>(new Kura);
shared_ptr<Gluptak>(new Gluptak);

shared_ptr<Rekin>(new Rekin);
shared_ptr<Pirania>(new Pirania);
shared_ptr<Glonojad>(new Glonojad);
shared_ptr<Karp>(new Karp);
shared_ptr<Sum>(new Sum);

shared_ptr<Wilk>(new Wilk);
shared_ptr<Gnu>(new Gnu);
shared_ptr<Mrowkojad>(new Mrowkojad);
shared_ptr<Kolczatka>(new Kolczatka);
shared_ptr<Slon>(new Slon);

}

z góry dziękuję za pomoc 

1 odpowiedź

+1 głos
odpowiedź 23 stycznia 2019 przez RafalS VIP (122,820 p.)
Jesli klasa ma zdefiniowany jakiś konstruktor to konstruktor domyslny(bez argumentow) nie jest generowany automatycznie. Musisz go jawnie dopisac lub przy deklaracji dopisac = default.

Czy na pewno kompilujesz plik .cpp z tymi klasami? No chyba że masz wszystko w plikach .h
komentarz 23 stycznia 2019 przez Mala_Mysz Nowicjusz (120 p.)
class Zwierzeta
{
public:
            Zwierzeta();
    virtual ~Zwierzeta();

virtual void get_prompt();

};

class Ptaki:protected Zwierzeta

{
public:
    Ptaki();
    ~Ptaki();

    void get_prompt()
    {
       cout<<"ma piora"<<endl;
    }

};

Mam wszystko; konstruktory i destruktory domyslne. Wszystko jest w .h. Powyżej przykładowe klasy; Klasa główna i jej pochodna. Takie drzewo się z tego robi, gdzie ostatnie są klasy z nazwami zwierząt z najbardziej szczegółowymi pytaniami, które chciałabym wrzucić w vector i losować.

komentarz 23 stycznia 2019 przez RafalS VIP (122,820 p.)
Zwierzeta();

to jest deklaracja metody a nie jej definicja.

To jest definicja pustego konstruktora:

Zwierzeta(){}

lub wymuszenie wygenerowania domyślnego:

Zwierzeta() = default;

 

Podobne pytania

0 głosów
3 odpowiedzi 2,342 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
0 głosów
1 odpowiedź 459 wizyt
0 głosów
3 odpowiedzi 235 wizyt

93,335 zapytań

142,330 odpowiedzi

322,415 komentarzy

62,669 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...