C ++覆盖虚方法抛出错误“LNK2001:未解析的外部符号”

时间:2014-04-06 17:41:05

标签: c++ qt qt-creator qmake qtgui

我正在开发C ++ Qt应用程序。我有一个抽象类和两个孩子。其中一个孩子完全按照应有的方式工作,但第二个孩子会导致错误:

  

Freewer.obj:-1:错误:LNK2001:未解析的外部符号" public:virtual void __thiscall Sierpinski :: render(class QPainter&,class QRect)" (?渲染@ @@谢尔宾斯基@@ UAEXAAVQPainter @@@ VQRect Z)

     

找不到档案:Freewer.obj

问题是,两个孩子的定义方式相同 让我们看看我的代码。

Fractal.h:

#ifndef FRACTAL_H
#define FRACTAL_H

#include <QPainter>
#include <QRect>
#include <QDebug>

class Fractal
{
public:
    virtual void render(QPainter &painter, QRect target) = 0;
};

#endif // FRACTAL_H

Cantor.h:

#ifndef CANTOR_H
#define CANTOR_H

#include "Fractal.h"

class Cantor : public Fractal
{
public:
    void render(QPainter &painter, QRect target) Q_DECL_OVERRIDE;
};

#endif // CANTOR_H

Cantor.cpp:

#include "Cantor.h"

void Cantor::render(QPainter &painter, QRect target)
{
    Q_UNUSED(painter);
    Q_UNUSED(target);

    qDebug() << "Rendering Cantor's Discontinuum...";
}

Sierpinski.h:

#ifndef SIERPINSKI_H
#define SIERPINSKI_H

#include "Fractal.h"

class Sierpinski : public Fractal
{
public:
    void render(QPainter &painter, QRect target) Q_DECL_OVERRIDE;
};

#endif // SIERPINSKI_H

Sierpinski.cpp:

#include "Sierpinski.h"

void Sierpinski::render(QPainter &painter, QRect target)
{
    Q_UNUSED(painter);
    Q_UNUSED(target);

    qDebug() << "Rendering Sierpinski triangle...";
}

现在,当我想创建Cantor类的实例时,它可以正常工作。但是当我想创建一个Sierpinski类的实例时,它会导致我上面写的错误。

当我以这种方式更改Sierpinsky头文件时:

Sierpinski.h:

#ifndef SIERPINSKI_H
#define SIERPINSKI_H

#include "Fractal.h"

class Sierpinski : public Fractal
{
public:
    void render(QPainter &painter, QRect target)
    {
        Q_UNUSED(painter);
        Q_UNUSED(target);

        qDebug() << "Rendering Sierpinski triangle...";
    }
};

#endif // SIERPINSKI_H

我不会使用Sierpinski.cpp,一切正常。难道不奇怪吗?你能帮我吗?我在哪里有任何错误?我想像康托尔一样使用谢尔宾斯基的定义。

非常感谢。

修改

@Joachim Isaksson 的问题之后,我尝试以与Cantor和Sierpinski相同的方式添加另一个分形,并且我得到了与Sierpinski相同的错误。新课程称为Koch,但它不起作用。但是当我离开Koch.cpp文件并直接在头文件中使用render函数的定义时,一切都还可以。

1 个答案:

答案 0 :(得分:1)

首先,你滥用了“孩子”这个词。你的意思是子类。儿童在Qt世界中意味着不同的东西。

可能的原因是您的qmake项目文件中的SOURCES变量中没有相应的源文件。

一旦你进行了改动,请确保qmake正确重新运行。