[英]Cannot Call Another Class - ERR - Unresolved External Symbol
我正在尝试从main.cpp调用Raw类中的另一个函数foo(),但我不断收到此错误,而且我不明白我的代码有什么问题。 我正在使用C ++,并且正在使用QT框架。 我是这种语言和框架的新手。
错误:LNK2019:在function_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";
}
原始文件
#ifndef RAW_H
#define RAW_H
class Raw
{
public:
Raw();
void foo();
};
#endif // RAW_H
在raw.cpp中,您必须像这样定义foo:
void Raw::foo()
{
cout << "hi\n";
}
您必须放入Raw ::,以便编译器知道这是类成员函数foo,而不是其他一些独立函数。
就像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; }
void doSomething(int val) { cout << val << endl; }
因为你现在描述如何处理该功能。
您可以按照我在头文件中的定义进行定义,也可以在Mihai所示的源文件(.c / .cpp)中进行定义(这是最佳做法)。 但是,您只能在Header文件中进行声明。
好的,这是一些替代方法:
//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 ++实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.