C++使用头文件实现数组栈时报undefined reference错误求助
C++ 栈实现链接错误修复方案
核心问题排查
你遇到的undefined reference报错,以及隐含的重复定义风险,由两个问题导致:
问题1:头文件写法不符合规范
当前Calc.h存在两个错误:
- 没有头文件包含保护,被多个cpp文件引用时会导致类重复定义
- 构造函数、析构函数的实现直接写在了头文件中,多文件编译时会报符号重复定义错误
问题2:编译配置未包含Calc.cpp
链接器找不到push、pop、displayStackElems的实现,是因为编译时没有把Calc.cpp加入编译单元。
具体修复步骤
第一步:修改Calc.h头文件
添加头文件保护,仅保留类成员的声明,移除实现代码:
#pragma once #include <iostream> using namespace std; #define SIZE 100 class Calc { int *arr,n,top=-1; public: Calc(int size = SIZE); // 构造函数声明 ~Calc(); // 析构函数声明 void push(int val); void pop(); void displayStackElems(); };
第二步:修改Calc.cpp实现文件
把原来头文件中的构造、析构实现挪到Calc.cpp中:
#include <iostream> #include "Calc.h" using namespace std; // 构造函数实现从.h迁移至此 Calc::Calc(int size) { arr = new int[size]; n = size; top = -1; } // 析构函数实现从.h迁移至此 Calc::~Calc() { delete[] arr; } void Calc::push(int val) { if (top >= n-1) cout<<"Stack Overflow"<<endl; else{ top++; arr[top]=val; } } void Calc::pop() { if (top <=-1) cout<<"Stack Underflow"<<endl; else{ cout << "The popped element is " << arr[top] << endl; top--; } } void Calc::displayStackElems() { if(top >=0){ cout<<"Stack elements are : "; for (int i = top; i >=0 ; i--) cout << arr[i] << " "; cout<<endl; } else cout<<"Stack is empty"; }
第三步:修正编译配置
- 手动编译场景:执行编译命令时需要包含所有cpp文件,示例命令:
g++ main.cpp Calc.cpp -o stack_calc - CMake构建场景:修改CMakeLists.txt的
add_executable配置,加入Calc.cpp:
修改后重新生成构建文件再编译即可。add_executable(untitled main.cpp Calc.cpp)
内容的提问来源于stack exchange,提问作者Deejay Super
相关产品推荐
相关产品推荐

