我正在开发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函数的定义时,一切都还可以。
答案 0 :(得分:1)
首先,你滥用了“孩子”这个词。你的意思是子类。儿童在Qt世界中意味着不同的东西。
可能的原因是您的qmake项目文件中的SOURCES
变量中没有相应的源文件。
一旦你进行了改动,请确保qmake正确重新运行。