_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 class ObiektBibl { static int licznik; int nr_serii; public: ObiektBibl(); };
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... |
|
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.: virtual auto wizytowka() const->void = 0;
A destruktor po prostu zdefniuj w ciele klasy, tak: virtual ~ObiektBibl() { }
albo tak: virtual ~ObiektBibl() = default;
PS. źle nazwałeś temat |
|
_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: 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'" |
|
Monika90 |
» 2014-12-13 18:13:25 ~ksiazka(); auto wizytowka() const override->void;
Musisz zdefiniować te dwie funkcje, teraz maz tylko deklaracje. A przy okazji auto wizytowka() const override->void;
to jest błąd składniowy, powinno być auto wizytowka() const->void override;
|
|
_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 |
|
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. |
|
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. |
|
_Radek Temat założony przez niniejszego użytkownika |
» 2014-12-14 18:23:50 dziękuję :) |
|
« 1 » |