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

时间:2012-02-16 19:20:26

标签: c++ qt

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

错误: LNK2019:函数_main中引用的未解析的外部符号“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 << "hi\n";
}

Raw::Raw()
{
    cout << "raw\n";
}

raw.h

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo();
};

#endif // RAW_H

3 个答案:

答案 0 :(得分:4)

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

void Raw::foo()
{
    cout << "hi\n";
}

你必须放置Raw ::以便编译器知道这是类成员函数foo而不是其他一些独立函数。

答案 1 :(得分:3)

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

class Raw {
public:
    void foo() {
        cout << "hi\n";
    }
};

只有你应该真正做到这一点的时间是非常简单的类和方法,只不过是吸气剂。

你应该理解在C ++中定义和声明某些东西之间的区别。

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

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

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

答案 2 :(得分:2)

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

//raw.h

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo(){cout << "raw\n";}
};

//raw.h

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo();
};

Raw::Raw()
{
    cout << "raw\n";
}

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