无法调用另一个类-ERR-未解析的外部符号

Cannot Call Another Class - ERR - Unresolved External Symbol

本文关键字:外部 符号 -ERR- 调用 另一个      更新时间:2023-10-16

我正试图从main.cpp调用Raw类中的另一个函数foo(),但我一直收到这个错误,我不明白我的代码出了什么问题。我在C++中工作,我使用的是QT框架。我是这个语言和框架的新手。

错误:LNK2019:未解析的外部符号"public:void __thiscall RAW::foo(void)"(?foo@Raw@@QAEXXZ)。找不到文件:main.obj

main.cpp

#include "raw.h"
using namespace std;

int main(int, char*)
{
    Raw newRaw;
    newRaw.foo();
    return 0;
}

raw.cpp

#include "raw.h"
#include <iostream>
using namespace std;
void foo()
{
    cout << "hin";
}
Raw::Raw()
{
    cout << "rawn";
}

原始.h

#ifndef RAW_H
#define RAW_H
class Raw
{
public:
    Raw();
    void foo();
};
#endif // RAW_H

在raw.cpp中,您必须像这样定义foo:

void Raw::foo()
{
    cout << "hin";
}

您必须放入Raw::,这样编译器就知道这是类成员函数foo,而不是其他独立函数。

正如Mihai所说,您也可以在Header文件(.h/.hpp)中定义它,但如果您的类方法在任何方面都很复杂,则这被认为是不好的做法。

class Raw {
public:
    void foo() {
        cout << "hin";
    }
};

真正应该这样做的唯一时间是对于极其简单的类和实际上只不过是getter的方法。

您应该理解在C++中定义和声明某物之间的区别。

声明只是简单地制作一个原型,例如void doSomething(int);是一个有效的声明,因为它表明方法doSomething接受int并返回void。

现在,你需要描述一下它的作用。这是执行void doSomething(int val) { cout << val << endl; }时的定义,因为您现在正在描述如何使用该函数。

您可以在头文件中进行定义,如我所示,也可以在源文件(.c/.cpp)中进行定义(如Mihai所示)(这是最佳实践)。不过,您只能在Header文件中进行声明。

好的,这是一些替代方案:

//raw.h
#ifndef RAW_H
#define RAW_H
class Raw
{
public:
    Raw();
    void foo(){cout << "rawn";}
};

//raw.h
#ifndef RAW_H
#define RAW_H
class Raw
{
public:
    Raw();
    void foo();
};
Raw::Raw()
{
    cout << "rawn";
}

在这两种情况下,您将不再需要raw.cpp中的实现。但正如我之前所说,我的第一个解决方案是标准的c++实践。