Cannot instantiate abstract class - Error C2259
Ostatnio zmodyfikowano 2017-04-07 17:50
lumberjackdrwal Temat założony przez niniejszego użytkownika |
Cannot instantiate abstract class - Error C2259 » 2017-04-06 23:50:55 Witam, Napisałem prosty program, w którym zadeklarowałem klasę Potion i klasy pochodne dziedziczące publicznie- HealthPotion i StrenghtPotion. Potion ująłem jako klasę abstrakcyjną (metoda printPotionType() jest czysto wirtualna), a w klasach pochodnych również określiłem funkcje printPotionType(), jak w kodzie poniżej (plik Potion.h): class Potion { std::string name; public: Potion( const std::string n ); Potion( const Potion & other ); virtual ~Potion(); virtual void printPotionType() = 0; const std::string & getName() const; };
class HealthPotion : public Potion { int moc; public: HealthPotion( std::string n = "HP Potion", int m = 5 ); ~HealthPotion(); void printPotionType(); };
class StrenghtPotion : public Potion { int time; public: StrenghtPotion( std::string n = "STR Potion", int t = 240 ); ~StrenghtPotion(); void printPotionType(); };
Nawet kiedy w funkcji main() w głównej części programu zostawię tylko return 0 , to kompilator wyrzuca błąd w postaci C2259- 'Potion': cannot instatiate abstract class . Na wszystkich forach (o ile dobrze rozumiem) jest napisane, że ten błąd wynika z tego, że żadna z metod klas pochodnych nie odpowiada metodzie czysto wirtualnej danej klasy. Jednak jestem przekonany, że te metody odpowiadają sobie. Dopisywanie słowa 'override' również nic nie daje. Dodam, że gdy zamiast metody czysto wirtualnej piszę virtual void printPotionType() {}, to wtedy program kompiluje się, więc problem z pewnością leży w funkcji printPotionType(). |
|
carlosmay |
» 2017-04-07 08:21:30 |
|
michal11 |
» 2017-04-07 09:49:29 pokaż main. Dopisz virtual i override przy tej metodzie w klasach dziedziczących. |
|
lumberjackdrwal Temat założony przez niniejszego użytkownika |
» 2017-04-07 12:28:49 Main jest pusty. Z problemem jako tako się uporałem poprzez usunięcie z projektu innej klasy, która używała klasy Potion: Player.h: #pragma once
#include <string> #include <vector> #include "Potion.h"
using std::vector;
class Player { std::vector < Potion > potions; public: void addPotion( const Potion & potion ); Player(); Player( const std::string & name, int strength, int mana, int defence, double health ); ~Player(); void print() const;
Player.cpp: #include <iostream> #include "Player.h"
using std::string; using std::cout; using std::endl;
using std::vector;
void Player::addPotion( const Potion & potion ) { potions.push_back( potion ); }
Wydaje mi się, że w metodzie addPotion() nie powinienem używać klasy Potion tylko jej klas pochodnych. Inaczej nie mam pomysłu, gdzie może tkwić błąd |
|
carlosmay |
» 2017-04-07 13:34:25 Wydaje mi się, że w metodzie addPotion() nie powinienem używać klasy Potion tylko jej klas pochodnych. |
Jeśli deklarujesz obiekt klasy Potion , to jest właśnie ten błąd. |
|
j23 |
» 2017-04-07 15:18:48 Już "gdzieś" widziałem te klasy i ten problem. Czy OP jest tym, o którym myślę? ;) |
|
michal11 |
» 2017-04-07 17:50:49 W playerze masz vector obiektów klasy potion czyli chcesz tworzyć instancje klasy abstrakcyjnej. Swoją drogą to wrzucając do tego wektora klasy dziedziczące po potion masz slicing. |
|
« 1 » |