• 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

Object Storage Arubacloud
0 głosów
475 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,115 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
0 głosów
1 odpowiedź 274 wizyt
0 głosów
3 odpowiedzi 184 wizyt

92,693 zapytań

141,605 odpowiedzi

320,103 komentarzy

62,051 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...