C++ 重写虚方法抛出错误 "LNK2001: unresolved external symbol"

标签 c++ qt qt-creator qmake qtgui

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

Freewer.obj:-1: Error: LNK2001: unresolved external symbol "public: virtual void __thiscall Sierpinski::render(class QPainter &,class QRect)" (?render@Sierpinski@@UAEXAAVQPainter@@VQRect@@@Z)

File not found: Freewer.obj

问题是,两个 child 的定义方式相同。
让我们向您展示我的代码。

分形.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

康托.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

康托尔.cpp:

#include "Cantor.h"

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

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

谢尔宾斯基.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

谢尔宾斯基.cpp:

#include "Sierpinski.h"

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

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

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

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

谢尔宾斯基.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 相同的错误。新类(class)称为 Koch,它不起作用。但是当我离开 Koch.cpp 文件并直接在头文件中使用渲染函数的定义时,一切正常。

最佳答案

首先,您误用了“ child ”一词。你的意思是子类。 child 在 Qt 世界中意味着不同的东西。

可能的原因是你的qmake工程文件的SOURCES变量中没有相应的源文件。

一旦你做了修改,确保 qmake 正确地重新运行。

关于C++ 重写虚方法抛出错误 "LNK2001: unresolved external symbol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897579/

相关文章:

c++ - 使用 stdio.h 重定位和重命名文件 C++

c++ - 为什么 C++ 不允许参数是默认参数?

c++ - Qt Error request for member 'rowCount' in 'a' 非类类型 'QTableWidget*'

c++ - 在 Qt 4.7 中,如何将弹出菜单添加到 QToolbar 按钮?

qt-creator - 如何在 Qt Creator 中获取标签文本的上标?

c++ - 无限 while 循环中的 sleep() 如果未以\n 结束,则不打印值

c++ - QT 5.7 QPainter 线条对齐

c++ - 无法使用 QtSQL 编译 Qt 项目(链接器错误)

c++ - 在 Windows 上将 TagLib 编译成 Qt C++ 项目

c++ - 在 C++ 中包含两次头文件