使用头文件中包含的函数时出现未定义引用问题

11
我遇到了一些奇怪的情况,可能是与我的C++源代码或编译器本身有关。当我尝试编译文件时,它会弹出以下消息: "Basic_int_stack::Basic_int_stack()"的引用未定义 "Basic_int_stack::Push(int)"的引用未定义 以下是我的代码(我还是一个初学者,所以不要期望什么疯狂的专业代码):
头文件:
class Basic_int_stack
{
  public:
    // This part should be implementation independent.
    Basic_int_stack(); // constructor
    void push( int item );
    int pop();
    int top();
    int size();
    bool empty();

  private:
    // This part is implementation-dependant.
    static const int capacity = 10 ; // the array size
    int A[capacity] ; // the array.
    int top_index ; // this will index the top of the stack in the array
};

实现:

#include "basic_int_stack.h"// contains the declarations of the variables and functions.

Basic_int_stack::Basic_int_stack(){
  // the default constructor intitializes the private variables.
  top_index = -1; // top_index == -1 indicates the stack is empty.
}

void Basic_int_stack::push( int item ){
  top_index = top_index + 1;
  A[top_index] = item ;
}

int Basic_int_stack::top(){
  return A[top_index];
}

int Basic_int_stack::pop(){
  top_index = top_index - 1 ;
  return A[ top_index + 1 ];
}


bool Basic_int_stack::empty(){
  return top_index == -1 ;
}

int Basic_int_stack::size(){
    return top_index;
}

主要功能:

#include "basic_int_stack.h"
#include <iostream>


int main()
{
    int var;

    Basic_int_stack s1;
    while((std::cin >> var)>=0){
        s1.push(var);
    }
    return 0;
}

你确定你正在编译实现 Basic_int_stack 的文件吗? - Lahiru Chandima
在想同样的事情。如果 cpp 文件未包含在项目中,它将无法链接以生成 exe。您确定这是编译器错误而不是链接器错误吗? - Phil Cairns
它们都在一个文件中,我会尝试查看我的编译器。 - user3720526
3个回答

27

出现这种情况是因为您正在构建主文件,但没有构建和链接类实现文件。您需要调整构建设置。


你真是个救命稻草啊,伙计! - Dilunga the Great

3
因为你没有在编译时包含Basic_int_stack.cpp文件。
简单地说,当你遇到“未定义的引用xxx”时,这是链接器生成的错误,意味着编译器找不到实现方式。所以你需要检查是否包含了cpp文件或动态库或静态库。

-13

我遇到了同样的问题。最终,我通过在主文件中包含 .cpp 文件来解决了这个问题。

#include "file_name.cpp" //In the main file

13
不,不,不,不,非也。 - M.M
你是什么意思? - Vineeth Reddy
2
包含一个 .cpp 文件并不能告诉链接器任何信息。链接器也不会编译文件,因此无法让链接器编译文件,即使可能也没有意义。 - M.M
4
不,#include 就像复制粘贴一样。 - M.M
2
也许对于一个简单的程序来说可以,但并不是普遍适用的做法,而且这是一种不好的编程习惯。 - M.M
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接