每当我编译#includes一个用户定义的类的东西时,我会得到总是这样的编译错误:main.cpp: undefined reference to Complex::Complex(double, double)
我已将问题简化为一组三个非常裸的文件:main.cpp,例如Complex.h和Complex.cpp。我仍然得到未定义的引用错误。我正在开发Windows上的Code :: Blocks,但我在Ubuntu中使用g ++也得到了同样的东西。为什么会这样?我尝试在Code :: Blocks中的main.cpp之前构建Complex.cpp,并且我尝试了g++ main.cpp Complex.cpp
,就像我尝试g++ main.cpp
一样。每次都有相同的错误。
/*======== main.cpp ========*/
#include "Complex.h"
int main()
{
Complex A(1.0, 1.0);
return 0;
}
/*======== Complex.h ========*/
#ifndef _COMPLEX_H
#define _COMPLEX_H
class Complex
{
public:
double x, y;
Complex(double real, double imag);
};
#endif
/*======== Complex.cpp ========*/
#include "Complex.h"
Complex::Complex(double real, double imag)
{
x = real;
y = imag;
}
ed:现在我得到了不同的错误,所以我必须做一些完全错误的事情。使用与上面相同的代码,我得到:
main.cpp: in function 'int main()':
main.cpp:5:5: error: 'Complex' was not declared in this scope
main.cpp:5:13: error: expected ';' before 'A'
这很奇怪。当我在.cpp文件中使用类时,一切都工作得很早,但这是“不好的做法”所以我将类定义移动到.h文件并将实现保存在.cpp文件中,现在没有任何作用。
答案 0 :(得分:7)
这不是编译错误,而是链接错误。您需要确保将所有对象链接在一起。您可以通过以下几种方式实现这一目标:
g++ main.cpp Complex.cpp
应该可以正常工作(当我尝试使用你的例子时,它会在这里工作)。您也可以分步执行:
g++ -c main.cpp
g++ -c Complex.cpp
g++ main.o Complex.o
答案 1 :(得分:1)
虽然我们不知道这是否是实际代码(可能不适用于其他几个代码),让我们对代码本身进行一些评论......(这对链接器错误没有任何影响) )
private
。很少需要制作实际的数据成员public
(有时制作非功能成员public
是合理的,例如用户可以订阅回调的事件类,但这些通常表现得像函数一样在技术上是对象)。初始化最好在成员初始化列表中完成。也就是说,构造函数看起来像这样:
复杂::复杂(双实,双重图像): X(真), Y(IMAG) { }
最后,冒险尝试一下导致链接问题的实际代码出了什么问题:
inline
。显然,除非在使用构造函数的地方看到定义,否则这将不起作用。Complex
的声明以某种方式使它成为一个未命名的命名空间,因此定义恰好定义了一个不同于main.cpp所见的类。