You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:24:01