I have this C++ code, and I get undefined reference to vtable for Plant error with CodeBlocks I use Cpp11 complier. My real problem is that I can not fill the vector. I have already tried to add and remove destructors both virtual and normal (~Plant() {};) and I get the same error. The error in line 21 in my header file.
#include <iostream>
#include <vector>
#include <cstdlib>
#include <fstream>
#include <vector>
#include "Plant.h"
using namespace std;
int main(){
vector<Plant*> novenyek;
int novenyszam = 3;
for (int i=0; i<novenyszam; i++){
string a = "Falank";
// novenyek.push_back(new Puffancs(a,7,true));
//new Puffancs("Falank",7,true);
//novenyek.push_back(new Puffancs("a",7,true));
novenyek[i] = new Plant(Puffancs("nev",7,true));
/// here is my error I can not make this vector with plants
}
///OUTput
for(auto i = novenyek().begin(); i != novenyek().end(); ++i)
{
}
}
return 0; }
My header:
#pragma once
#include <string>
#include <ostream>
#include <stdlib.h>
enum Sugarzas
{
ALFA,
DELTA,
NONE,
};
struct SugarzasIgeny
{
Sugarzas _sugarzas;
int _mennyiseg;
SugarzasIgeny(Sugarzas sugarzas, int mennyiseg = 0): _mennyiseg(mennyiseg), _sugarzas(sugarzas) {}
};
class Plant
{
public:
Plant(const std::string &nev, int tapanyag, bool El_e) : _nev(nev), _tapanyag(tapanyag), _El_e(El_e) {}
//~Plant() {};
std::string nev() const { return _nev; }
int tapanyag() const { return _tapanyag; }
bool El_e() const { return _El_e; }
// Sablonfuggveny
virtual SugarzasIgeny nap(Sugarzas sugarzas);
protected:
std::string _nev; //noveny neve
int _tapanyag; //tapanyaga
bool _El_e; //ele
};
class Puffancs : public Plant
{
public:
Puffancs(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) {}
virtual SugarzasIgeny nap(Sugarzas sugarzas) ;
};
class Deltafa : public Plant
{
public:
Deltafa(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) {}
virtual SugarzasIgeny nap(Sugarzas sugarzas) ;
};
class Parabokor : public Plant
{
public:
Parabokor(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) {}
virtual SugarzasIgeny nap(Sugarzas sugarzas) ;
};
My plant.cpp file
#include "Plant.h"
SugarzasIgeny Puffancs::nap(Sugarzas sugarzas)
{
switch (sugarzas)
{
case Sugarzas::ALFA :
_tapanyag += 2;
break;
case Sugarzas::DELTA :
_tapanyag -= 2;
break;
case Sugarzas::NONE :
_tapanyag -= 1;
break;
default:
break;
}
if ( _tapanyag > 0 && _tapanyag <=10){
_El_e = false;
}else {
_El_e = true;
}
return SugarzasIgeny(Sugarzas::ALFA, 10);
}
SugarzasIgeny Deltafa::nap(Sugarzas sugarzas)
{
switch (sugarzas)
{
case Sugarzas::ALFA :
_tapanyag -= 3;
break;
case Sugarzas::DELTA :
_tapanyag += 4;
break;
case Sugarzas::NONE :
_tapanyag -= 1;
break;
default:
break;
}
if (_tapanyag > 0)
{_El_e = true;}
else {_El_e = false; }
if (_tapanyag <5 ){
return SugarzasIgeny(Sugarzas::DELTA, 4);
}
else if (_tapanyag >= 5 && _tapanyag <= 10 ){
return SugarzasIgeny(Sugarzas::DELTA, 1);
}else {
return SugarzasIgeny(Sugarzas::NONE, 10);
}
}
SugarzasIgeny Parabokor::nap(Sugarzas sugarzas)
{
switch (sugarzas)
{
case Sugarzas::ALFA :
_tapanyag++;
break;
case Sugarzas::DELTA :
_tapanyag++;
break;
case Sugarzas::NONE :
_tapanyag--;
break;
default:
break;
}
// _El_e = tapanyag > 0;
if (_tapanyag > 0){_El_e = true;}
else {_El_e = false;}
return SugarzasIgeny(Sugarzas::NONE, 10);
}