Prikaz jedne poruke
Stara 3.6.2012, 8:41   #80
M.Silenus
Veteran
 
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
Određen forumom Re: How to... C++

Verovatno nisi definisao podrazumevani konstruktor u klasi Element.
Podrazumevani konstruktor je konstruktor bez argumenata, u tvom slučaju Element::Element(void). Ako ne definišeš nijedan kostruktor, podrazumeva se da on postoji - aka, kompajler ga automatski definiše. On the other hand, ako definišeš neki ne-podrazumevani konstruktor, onda da bi imao i podrazumevani, moraš i njega da definišeš.

Na primer:

Kod:
class Element
{
public:
    Element(int i); // vise nema podrazumevanog konstruktora
};

class ElementI : public Element
{
    double x;
public:
    ElementI(double x_)
       : x(x_) {}
};
Pošto ovde nije eksplicitno pozvan konstruktor za Element, kompajler ubacuje poziv Element::Element() ispred poziva konstruktora za polja klase ElementI.

Tj. kompajler generiše ovo:

Kod:
class ElementI : public Element
{
    double x;
public:
    ElementI(double x_)
       :  Element(),
           x(x_) 
     {}
};
Ali, Element::Element() ne postoji, pa dobijaš linkersku grešku. Čudi me da je ne dobijaš ranije.

Rešenje: definiši Element::Element(), ili eksplicitno pozovi neki od definisanih konstruktora za Element. Čak bih ti predložio da uvek sam pozivaš kostruktore bazne klase, tako si uvek znaš šta se poziva - pogotovo ako nisi baš načisto sa tim šta je podrazumevana akcija u tom slučaju.

BTW. ako ti kompajler podržava C++11, i ako ti je podrazumevana implementacija podrazumevanog konstruktora odgovarajuća (ona samo poziva podrazumevane konstruktore svojih polja), onda možeš da uradiš ovo:

Kod:
class Element
{
public:
    Element() = default;
    Element(int i); // vise nema podrazumevanog konstruktora
};
Ovako ne moraš da definišeš taj konstruktor, dovoljna je deklaracija.
M.Silenus je offline   Odgovor sa citatom ove poruke