Cygwin环境下C++编译出现Undefined reference to constructor错误求助
解决C++链接错误:undefined reference to
lint::lint() 你这是卡在链接阶段的未定义引用问题了,我来帮你拆解下根源和解决办法:
问题本质
你看到的undefined reference错误,说明编译器能通过头文件找到lint类的声明,但链接器找不到这些成员函数的实际实现代码。核心问题出在你的lint.cpp写法上——你在源文件里重新定义了整个lint类,而不是去实现头文件中已经声明的类成员。
编译器会把源文件里的这个局部类和头文件里的类视为两个完全独立的实体,所以链接器自然找不到tester.cpp里调用的lint::lint()对应的实现。
修复步骤
1. 修正lint.cpp的写法
不要在源文件里重复定义类,而是先包含头文件,再用类名::成员函数的语法实现每个成员:
#include "lint.h" // 默认构造函数实现 lint::lint(){ a = new int(); } // 带int参数的构造函数实现 lint::lint(int b){ a = new int(b); } // 拷贝构造函数实现 lint::lint(lint& b){ a = new int(b.value()); } // value成员函数实现 int lint::value(){ return *a; }
2. 补全lint.h的私有成员
你的头文件里没有声明私有成员int* a;,这会导致编译时找不到这个变量。修改后的头文件应该是:
#ifndef HEADER_LINT_H_ #define HEADER_LINT_H_ class lint{ private: int* a; // 必须在这里声明私有成员,源文件才能访问 public: lint(); lint(int b); lint(lint& b); int value(); }; #endif
额外注意事项
- 确认
lint.cpp已经被添加到Eclipse项目的编译列表中,只有它被编译成目标文件,链接器才能找到对应的实现 - 头文件包含建议:如果是项目本地的头文件,用
"lint.h"比<lint.h>更明确(后者是从系统include目录查找) - 小优化:拷贝构造函数的参数建议改成
const lint& b,这样可以接受const对象的拷贝,减少不必要的限制
内容的提问来源于stack exchange,提问作者Drachencheat
相关产品推荐
相关产品推荐

