我有一个抽象类,当我尝试删除该类的实例时,我遇到了一些错误。
class CCobjectBase
{
public:
CCobjectBase();
virtual ~CCobjectBase();
virtual void createPainterPath() = 0;
};
class CTriangle : public CCobjectBase
{
public:
CTriangle();
~CTriangle();
void createPainterPath();
};
CCobjectBase :: ~CCobjectBase(){}
我创建对象如下:
std::vector<CCobjectBase *> m_objectBaseList;
m_objectBaseList.push_back(new CTriangle());
//do stuff with m_objectBaseList
delete m_objectBaseList.at(index);
m_objectBaseList.erase(m_objectBaseList.begin() + index);
我在~CTriangle()
&#34;未定义引用CCobjectBase ::〜CCobjectBase()&#34;时检索错误。如果我从CCobjectBase中删除虚拟析构函数,我会收到警告&#34;删除具有非虚析构函数的抽象类类型CCobjectBase的对象将导致未定义的行为&#34;这真的很烦人,但修复会导致更多问题。
更新 这有点愚蠢,但我试过运行qmake - &gt;重建所有,没有任何反应,但当我重新启动应用程序时,没有显示任何错误或警告。为什么现在有效?我不知道。
答案 0 :(得分:3)
你的方法
virtual ~CCobjectBase();
未定义。它已声明,但您没有提供定义。 使用C ++ 11,您可以将声明更改为
virtual ~CCobjectBase() = default;
表示空的定义。
答案 1 :(得分:1)
当我替换以下定义时,我用clang++
进行编译:
#include <vector>
class CCobjectBase
{
public:
CCobjectBase() {};
virtual ~CCobjectBase() {};
virtual void createPainterPath() = 0;
};
class CTriangle : public CCobjectBase
{
public:
CTriangle();
~CTriangle();
void createPainterPath();
};
CTriangle::CTriangle() {}
CTriangle::~CTriangle() {}
void CTriangle::createPainterPath() {}
int main() {
std::vector<CCobjectBase *> m_objectBaseList;
m_objectBaseList.push_back(new CTriangle());
//do stuff with m_objectBaseList
int index = 0;
delete m_objectBaseList.at(index);
m_objectBaseList.erase(m_objectBaseList.begin() + index);
}
如果这不适合您,请提供更多信息。