[C++] Jakiś mały błąd - undefined reference to...

0

Witam,

Podczas kompilacji poniższego kodu pojawia mi się błąd:
[Linker error] undefined reference to `Zwierze::Zwierze()'
ld returned 1 exit status

Chyba jest dość banalny, ale dokładnie nie wiem, o co chodzi...:-(

Z góry dzięki za pomoc!

#include <iostream>
using namespace std;
enum KOLOR {Czerwony, Zielony, Niebieski, Szary, Bialy, Czarny, Brazowy } ;
class Zwierze {
    public:
        Zwierze();
        Zwierze(int);
        virtual int PodajWiek() const { return jegoWiek; }
        virtual void UstawWiek(int wiek) { jegoWiek = wiek; }
        virtual void Spij() const = 0;
        virtual void Jedz() const = 0;
        virtual void Rozmnazaj() const = 0;
        virtual void Idz() const = 0;
        virtual void DajGlos() const = 0;
    private:
        int jegoWiek;
};
class Ssak : public Zwierze {
      public:
      Ssak() {
	  	  cout << "Ssaki sa roznokolorowe...\n";
	  };
      Ssak(int, KOLOR);
      virtual void DajGlos() const
      {
          cout << "Ssaki wydaja rozne glosy...\n";
      }
      virtual void Rozmnazaj () const
      {
          cout << "Ssaki rozmnazaja sie przez kopulacje...\n";
      }
};
class Ryba : public Zwierze {
    protected:
    KOLOR jegoKolor;
      public:
      Ryba();
      Ryba(int)
      {
          cout << "Ryba ma kolor " << jegoKolor << "\n";
      }
      virtual void Spij () const
      {
          cout << "Ryba nie zamyka oczu jak spi, ale spi...\n";
      }
      virtual void Jedz() const
      {
          cout << "Ryba je plankton...\n";
      }
      virtual void Rozmnazaj () const
      {
          cout << "Ryba sklada ikre...\n";
      }
      virtual void Idz() const
      {
          cout << "Ryba plywa...\n";
      }
      virtual void DajGlos() const
      {
          cout << "Dzieci i ryby glosu to nie maja...\n";
      }
};
class Kon : public Ssak {
    protected:
    KOLOR jegoKolor;
    public:
      Kon(int, KOLOR)
      {
          cout << "Kon ma kolor " << jegoKolor << "\n";
      }
      virtual void Spij () const
      {
          cout << "Kon spi na stojaco...\n";
      }
      virtual void Jedz() const
      {
          cout << "Kon je owies...\n";
      }
      virtual void Rozmnazaj () const
      {
          cout << "Kon z klacza kopuluja...\n";
      }
      virtual void Idz() const
      {
          cout << "Kon galopuje...\n";
      }
      virtual void DajGlos() const
      {
          cout << "Kon rzy...\n";
      }
};
class Pies : public Ssak {
protected:
KOLOR jegoKolor;
public:
      Pies(int, KOLOR)
      {
          cout << "Pies ma kolor " << jegoKolor << "\n";
      }
      virtual void Spij () const
      {
          cout << "Pies spi w budzie...\n";
      }
      virtual void Jedz() const
      {
          cout << "Pies wcina kosci...\n";
      }
      virtual void Rozmnazaj () const
      {
          cout << "Pies z suczka kopuluja...\n";
      }
      virtual void Idz() const
      {
          cout << "Pies biega...\n";
      }
      virtual void DajGlos() const
      {
          cout << "Pies robi hau hau...\n";
      }
};
int main()
{
    Zwierze *pZwierze=0;
    int choice;
    bool Koniec = false;
    while (1) {
        cout << "(1)Pies (2)Kon (3)Ryba (0)Koniec: ";
        cin >> choice;
        switch (choice)
        {
            case 1: pZwierze = new Pies(5,Brazowy);
            break;
            case 2: pZwierze = new Kon(4,Czarny);
            break;
            case 3: pZwierze = new Ryba (5);
            break;
            default: Koniec = true;
            break;
        }
        
        if (Koniec)
        break;
        
        pZwierze->DajGlos();
        pZwierze->Jedz();
        pZwierze->Rozmnazaj();
        pZwierze->Idz();
        pZwierze->Spij();
        delete pZwierze;
        cout << "\n";
    }
    return 0;
}
0

Definicje konstruktora bezparametrowego dla typu Zwierze to zjadlo ono czy moze pies?

0

OK, dzięki. Nie zauważyłem tego... Teraz program się kompiluje, ale mam problem z kolorem, gdyż zamiast nazwy wybieranej z tablicy pojawia się ciąg liczb z pamięci.

Jeszcze tylko to i będzie OK!;-)

0

Cześć Marianno!

Wytłumacz mi do czego wykorzystasz nienazwany argument powiedzmy w tej funkcji: Ssak(int, KOLOR) ?

0
Marianno napisał(a)

zamiast nazwy wybieranej z tablicy pojawia się ciąg liczb z pamięci.

Jeśli nie wpisujesz nic w składnik obiektu klasy przy jego konstrukcji ani nigdzie indziej to po prostu wypisujesz przypadkowe wartości jakie znajdują się aktualnie w pamięci. Nazwij argumenty konstruktorów i tam przypisuj wartość do składnika jegoKolor. Samo się to nie zrobi :P

0

OK, nazwałem, zwraca mi cyferkę podaną w funkcji. Jak teraz wyciągnąć kolor odpowiadający tej cyfrze z enum KOLOR?

0

1' chciales użyć słowa liczba, nie cyfra

2' enum jest liczbą a nie napisem. napis jest tylko dla Ciebie, tylko w kodzie, programisty, żeby Ci się łatwiej czytalo. Twoj enum:

enum KOLOR {Czerwony, Zielony, Niebieski, Szary, Bialy, Czarny, Brazowy };

jest tożsamy z enum KOLOR {Czerwony=0, Zielony=1, Niebieski=2, Szary=3, Bialy=4, Czarny=5, Brazowy=6 };

 więc jeśli gdzies w zmiennej typu KOLOR widzisz 4, to jest oczywiste ze to jest Biały.

3' z tego powodu, skoro nazwy slowne enumow nie istnieja po skompilowaniu, niestety, NIE UDA Ci sie nijak w prosty sposob z samego li tylko enum wyciagnac nazwy tej 'czworki'

4' Jesli tego potrzebujesz, musisz zrobic to na około, musisz zadbac, aby 'nazwy' w jakis sposob przetrwaly kompilacje.. np:
```cpp
enum KOLOR {Czerwony, Zielony, Niebieski, Szary, Bialy, Czarny, Brazowy };
string KOLORn[] = {"Czerwony", "Zielony", "Niebieski", "Szary", "Bialy", "Czarny", "Brazowy"};
....
....
 KOLOR jakis = Bialy;
//jakis == 4
string nazwa_jakiegos = KOLORn[ (size_t)jakis ];
//nazwa = string("Bialy")

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