我使用Eclipse + GCC + MinGW。
AbstractValue.h:
#ifndef ABSTRACTVALUE_H_
#define ABSTRACTVALUE_H_
#include <string>
class AbstractValue {
public:
virtual AbstractValue* add(AbstractValue*) = 0;
virtual AbstractValue* sub (AbstractValue*) = 0;
virtual AbstractValue* mul (AbstractValue*) = 0;
virtual AbstractValue* div (AbstractValue*) = 0;
virtual std::string toString () = 0;
virtual ~AbstractValue() = 0;
};
#endif /* ABSTRACTVALUE_H_ */
IntegerValue.h
#ifndef INTEGERVALUE_H_
#define INTEGERVALUE_H_
#include "../AbstractValue/AbstractValue.h"
#include <string>
class IntegerValue: public AbstractValue {
private:
int value;
public:
IntegerValue(int);
~IntegerValue();
int getValue();
IntegerValue* add (AbstractValue*);
IntegerValue* sub (AbstractValue*);
IntegerValue* mul (AbstractValue*);
IntegerValue* div (AbstractValue*);
std::string toString();
};
IntegerValue.cpp:
#include "IntegerValue.h"
#include <stdlib.h>
IntegerValue::IntegerValue(int a) : value(a) {};
IntegerValue::~IntegerValue() {}
int IntegerValue::getValue() {
return this -> value;
}
IntegerValue* IntegerValue::add (AbstractValue* another) {
IntegerValue* anotherInteger = (IntegerValue*) another;
int newValue = this -> getValue() + anotherInteger -> getValue();
return new IntegerValue(newValue);
}
IntegerValue* IntegerValue::sub (AbstractValue* another) {
IntegerValue* anotherInteger = (IntegerValue*) another;
int newValue = this -> getValue() - anotherInteger -> getValue();
return new IntegerValue(newValue);
}
IntegerValue* IntegerValue::mul (AbstractValue* another) {
IntegerValue* anotherInteger = (IntegerValue*) another;
int newValue = this -> getValue() * anotherInteger -> getValue();
return new IntegerValue(newValue);
}
IntegerValue* IntegerValue::div (AbstractValue* another) {
IntegerValue* anotherInteger = (IntegerValue*) another;
int newValue = this -> getValue() / anotherInteger -> getValue();
return new IntegerValue(newValue);
}
std::string IntegerValue::toString() {
char *res = new char[1000];
itoa(this -> value, res, 10);
std::string a (res);
delete[] res;
return a;
}
我在undefined reference to AbstractValue::~AbstractValue()
上获得IntegerValue::~IntegerValue() {}
。为什么呢?
答案 0 :(得分:1)
纯virtual
析构函数必须具有实现(而不是纯virtual
方法,可以不执行)。
答案 1 :(得分:1)
由于
virtual ~AbstractValue() = 0;
表示纯虚拟,没有实现。这是错误的,析构函数不能是纯虚拟的,没有实现。使用此:
virtual ~AbstractValue() {}
即。一个空的实现。
(旁注:析构函数可以是纯虚拟的实现,但这里没有理由这样做)
答案 2 :(得分:0)
任何派生类'析构函数(~IntegerValue()
)必须调用基类'析构函数(~AbstractValue()
),因此仍然必须定义析构函数(即使它是空的):
所以,
// In file AbstractValue.cpp
AbstractValue::~AbstractValue(){ }