我正在开发C++ Qt应用程序。我有一个抽象类和两个 child 。其中一个 child 完全按照应有的方式工作,但是第二个 child 会导致错误:
问题在于,两个 child 的定义方式相同。
让我们向您展示我的代码。
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,一切正常。是不是很奇怪?你能帮我吗?我哪里有错?我想像Cantor一样使用Sierpinski定义。
非常感谢你。
编辑:
在提出@Joachim Isaksson问题之后,我尝试以与Cantor和Sierpinski相同的方式添加另一个分形,而我遇到了与Sierpinski相同的错误。新的类称为Koch,它无法正常工作。但是,当我离开Koch.cpp文件并直接在头文件中使用render函数的定义时,一切正常。
最佳答案
首先,您滥用了“ child ”一词。您的意思是子类。 child 在Qt世界中的意义有所不同。
可能的原因是您的qmake项目文件的SOURCES
变量中没有相应的源文件。
进行修改后,请确保qmake已正确运行。