2012-02-16 25 views
1

我想从main.cpp的Raw类中调用另一个函数foo(),但是我一直在得到这个错误,我不明白我的错在哪里码。我正在使用C++,并使用QT框架。我是这个语言和框架的新手。不能调用另一个类 - ERR - 无法解析的外部符号

错误: 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"; 
} 

raw.h

#ifndef RAW_H 
#define RAW_H 

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

#endif // RAW_H 

回答

4

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

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

你必须把Raw ::编译器知道这是类成员函数foo而不是其他独立函数。

+0

是否有替代Raw ::?例如,我在raw.h中可以做些什么? – Jon 2012-02-16 19:27:39

+0

你可以像这样在raw.h中定义函数:void foo(){cout <<“hi \ n”;}但对于更复杂的函数来说这不是一个好习惯。 – Mihai 2012-02-16 19:29:43

+0

我没有在raw.h中定义foo()吗?我在第8行去了“void foo();”。 – Jon 2012-02-16 19:30:38

3

正如Mihai所说的,您也可以在头文件(.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)中进行定义(这是最佳实践)。不过,您只能在头文件中进行声明。

+0

谢谢你的解释粉碎。这对我来说很有意义:) – Jon 2012-02-16 19:46:59

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++实践。

+0

我强烈建议习惯于将你的定义放在源代码中(关于原始海报)。 – crush 2012-02-16 19:45:58

+0

谢谢你的帮助Mihai。我想我现在开始更多地了解C++了:) – Jon 2012-02-16 19:47:29