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

Cannot instantiate abstract class - Error C2259

Ostatnio zmodyfikowano 2017-04-07 17:50
Autor Wiadomość
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):
C/C++
class Potion //Klasa abstrakcyjna- posiada przynajmniej jedną funkcję czysto wirtualną
{
    std::string name;
public:
    Potion( const std::string n );
    Potion( const Potion & other );
    virtual ~Potion(); //zadanie 12.
   
    virtual void printPotionType() = 0; //funkcja czysto wirtualna
   
    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().
P-159924
carlosmay
» 2017-04-07 08:21:30
Ten błąd może też oznaczać próbę utworzenia obiektu klasy abstrakcyjnej, czego nie wolno robić.
https://msdn.microsoft.com​/en-us/library/zxt206sk.aspx
P-159938
michal11
» 2017-04-07 09:49:29
pokaż main. Dopisz virtual i override przy tej metodzie w klasach dziedziczących.
P-159940
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:
C/C++
#pragma once

#include <string>
#include <vector>
#include "Potion.h"

using std::vector;

class Player {
    //tutaj atrybuty
   
    std::vector < Potion > potions;
   
public:
    void addPotion( const Potion & potion );
   
    // constructors and destructors
    Player();
   
    Player( const std::string & name, int strength, int mana, int defence, double health );
   
    ~Player();
   
    //methods
    void print() const;
   
    // getters and setters

Player.cpp:
C/C++
#include <iostream>
#include "Player.h"

using std::string;
using std::cout;
using std::endl;

using std::vector;

// constructors and destructor

// methods

void Player::addPotion( const Potion & potion ) {
    potions.push_back( potion );
}

// getters and setters

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
P-159943
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.
P-159944
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ę? ;)
P-159945
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.
P-159948
« 1 »
  Strona 1 z 1