Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++]metoda wirtualna, pojawia się problem z konstruktorem

Ostatnio zmodyfikowano 2014-12-14 18:23
Autor Wiadomość
_Radek
Temat założony przez niniejszego użytkownika
[C++]metoda wirtualna, pojawia się problem z konstruktorem
» 2014-12-13 17:06:02
Mam pewien problem, chcę zrobić klasę abstrakcyjną. Chciałbym żeby ona trzymała tylko jakiegoś inta, dodającego się automatycznie, różnego dla każdego obiektu tej klasy. Jedyny pomysł jaki miałem to zrobić to tak
C/C++
class ObiektBibl
{
    static int licznik;
    int nr_serii;
public:
    ObiektBibl();
    //    virtual ~ObiektBibl();
    //    virtual auto wizytowka() const -> void;
};

int ObiektBibl::licznik = 0;
ObiektBibl::ObiektBibl()
{
    licznik++;
    nr_serii = licznik;
}
i by było fajnie, tylko ma ona trzymać co najmniej jedną metodę wirtualną, a kiedy odkomenderuje albo destruktor albo wizytówkę to pojawia się błąd w linii
ObiektBibl::ObiektBibl()
  ,,undefined reference to `vtable for ObiektBibl' "
 Nie mam zielonego pojęcia o co chodzi...
P-122802
Monika90
» 2014-12-13 17:46:35
Jeżeli chcesz mieć w klasie funkcję wirtualną i nie podawać jej definicji, to musisz użyć specyfikatora = 0, to sprawi, że klasa będzie klasą abstrakcyjną, np.:

C/C++
virtual auto wizytowka() const->void = 0;

A destruktor po prostu zdefniuj w ciele klasy, tak:

C/C++
virtual ~ObiektBibl() { }

albo tak:

C/C++
virtual ~ObiektBibl() = default;

PS. źle nazwałeś temat
P-122803
_Radek
Temat założony przez niniejszego użytkownika
» 2014-12-13 18:06:56
Może źle napisałem o co mi chodzi. Problemem nie jest to że chcę mieć klasę abstrakcyjną (swoją drogą chcę, ale do tego jeszcze nie doszedłem). Nie mogę, nie wiem czemu zaimplementować w ogóle tego żeby jakaś metoda była wirtualna bo w konstruktorze  pojawia się problem o jakim wyżej napisałem.
 Jak wpisałem to o czym napisałaś to ten sam problem przeniósł się do klasy pochodnej tzn teraz mam tak:
C/C++
class ObiektBibl
{
    static int licznik;
    int nr_serii;
public:
    ObiektBibl();
    virtual ~ObiektBibl() { };
    virtual auto wizytowka() const->void = 0;
};

int ObiektBibl::licznik = 0;
ObiektBibl::ObiektBibl()
{
    licznik++;
    nr_serii = licznik;
}

class ksiazka
    : public ObiektBibl
{
    std::string autor_;
    std::string tytul_;
public:
    ksiazka( std::string autor, std::string tytul );
    ~ksiazka();
    auto wizytowka() const override->void;
};

ksiazka::ksiazka( std::string autor, std::string tytul )
    : autor_( autor )
     , tytul_( tytul )
{
};


 I teraz dla odmiany Code Bloks mi wywala błąd w linii
, tytul_( tytul )
 o tej samej treści co wcześniej tzn  "undefined reference to `vtable for ksiazka'"
P-122804
Monika90
» 2014-12-13 18:13:25
C/C++
~ksiazka();
auto wizytowka() const override->void;
Musisz zdefiniować te dwie funkcje, teraz maz tylko deklaracje.

A przy okazji
C/C++
auto wizytowka() const override->void;
to jest błąd składniowy, powinno być
C/C++
auto wizytowka() const->void override;
P-122806
_Radek
Temat założony przez niniejszego użytkownika
» 2014-12-13 19:49:25
Dzięki :) Jakbym mógł jeszcze się zapytać dlaczego jak mam tylko deklaracje tych metod to pojawia się tamten błąd? tzn w konstruktorze ich nie używam a to właśnie tam on się pojawia.

 Co do błędu składniowego to, na pewno?  tzn tak:
auto wizytowka() const override->void;
 mi się kompiluje a tak:
auto wizytowka() const->void override;
pojawia się w tej linii błąd
 expected ';' at end of member declaration oraz
 'override' does not name a type
P-122818
Elaine
» 2014-12-13 20:00:52
Co do błędu składniowego to, na pewno?  tzn tak:
auto wizytowka() const override->void;
 mi się kompiluje a tak:
auto wizytowka() const->void override;
pojawia się w tej linii błąd
 expected ';' at end of member declaration oraz
 'override' does not name a type
Tak, na pewno. Możesz sprawdzić w standardzie, konkretnie w skrawku gramatyki podanym na początku sekcji 9.2.
Zalecam aktualizację kompilatora.
P-122820
Monika90
» 2014-12-13 20:36:48
Dziękuję Alueril :)


Jakbym mógł jeszcze się zapytać dlaczego jak mam tylko deklaracje tych metod to pojawia się tamten błąd? tzn w konstruktorze ich nie używam a to właśnie tam on się pojawia.
Definicje funkcji wirtualnych są potrzebne by można było skonstruować tablicę wskaźników do funkcji wirtualnych dla danej klasy, z kolei konstruktor potrzebuje adresu tej tablicy by zainicjalizować obiekt. Każdy obiekt klasy z funkcjami wirtualnyim zawiera wskaźnik do tablicy wskaźników do f. wirtualnych. Ta tablica jest znana pod nazwą vtable.
P-122823
_Radek
Temat założony przez niniejszego użytkownika
» 2014-12-14 18:23:50
dziękuję :)
P-122861
« 1 »
  Strona 1 z 1