在C++中包含标题时未定义的引用
问题描述:
我正在处理我的项目,而我决定将其分解为文件。然而,我遇到了像这样的问题,我通过谷歌发现的所有建议都是关于忘记连接两个对象文件,我正在做对(至少我是这么认为的)。在C++中包含标题时未定义的引用
生成文件:
test : class.o main.o
g++ class.o main.o -o test.exe
main.o : main.cpp
g++ main.cpp -c
class.o : class.cpp
g++ class.cpp -c
的main.cpp
#include <iostream>
#include "class.h"
using namespace std;
int main() {
Trida * t = new Trida(4);
t->fce();
return 0;
}
class.h
#ifndef CLASS
#define CLASS
class Trida {
private:
int a;
public:
Trida(int n);
void fce();
};
#endif
class.cpp
#include <iostream>
using namespace std;
class Trida {
private:
int a;
public:
Trida(int n) {
this->a = n;
}
void fce() {
cout << this->a << endl;
}
};
错误消息:
[email protected]:~/Skola/test$ make
g++ class.cpp -c
g++ main.cpp -c
g++ class.o main.o -o test.exe
main.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `Trida::Trida(int)'
main.cpp:(.text+0x54): undefined reference to `Trida::fce()'
collect2: ld returned 1 exit status
make: *** [test] Error 1
答
因此,这里是你做错了什么。在class.cpp中,您重新创建了一个新的 Trida类,而不是实现您在class.h中创建的类。你应该class.cpp看起来更像是这样的:
#include <iostream>
#include "class.h"
using namespace std;
Trida::Trida(int n)
{
this->a = n;
}
void Trida::fce() { cout << this->a << endl; }
而且真的,你应该使用初始化,而不是在构造函数赋值:
Trida::Trida(int n) : a(n) {}
答
你定义在头文件类trida
两次( class.h
和源文件class.cpp
)在 你class.cpp文件应该像
#include <iostream>
#include "class.h" //include "class.h"
using namespace std;
Trida::Trida(int n):a(n) //Initialization list
{
}
void Trida::fce()
{
cout << this->a << endl;
}
哇,这是快。问题比我想象的要简单。非常感谢你 :-) – Gwynbleidd 2011-01-08 05:28:18