对 CLASS::function() 的未定义引用

undefined reference to CLASS::function()

本文关键字:未定义 引用 CLASS function      更新时间:2023-10-16

因此,当我尝试使用"g ++ Asg5.cpp简单地编译我的代码时,我收到以下错误

/

tmp/cczhpSGO.o: 在函数 'main' 中:

Asg5.cpp:(.text+0x2fb):对"BinomialTree::insert(int)"的未定义引用

收集2:LD 返回 1 个退出状态

如果有人想知道为什么我不使用 makefile,我的教授只想用 main()> 键入 g++ <.cpp 进行编译。

无论如何,这是我的代码,我非常感谢您的帮助!

ASG5.cpp

#include "BinomialTree.h"
#include "BinomialNode.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <stdlib.h>
#include <string>
#include <stdio.h>
using namespace std;
int main(int argc, char* argv[])
{
    //input handling
    if(argc != 2)
    {
        cout << "Incorrect Usage. n Example: ./a.out <filename>" << endl;
        exit(1);
    }
    BinomialTree *tree = new BinomialTree(); 
    
    char *buffer;
    char *token;
    //read file into buffer.**************************************
    string input;
    ifstream file;
    file.open(argv[1]);
    if(file.is_open())
    {
        string str;
        while(file.good())
        {
            getline(file,str);
            input += " " + str;
        }
    }
    else{
        cout << "File not found"<< endl;
        return 1;
    }
    file.close();
    
    int buf;
    stringstream ss(input);
    
    vector<int> tokens;
    while(ss >> buf)
    {
        tokens.push_back(buf);
    }
    int i = 0;
    for(i = 0; i < tokens.size(); i++)
        tree->insert(tokens[i]);
    //end file reading *******************************************
    delete tree;
}

二项式节点.h

#ifndef _BINOMIALNODE_H_
#define _BINOMIALNODE_H_
#include "BinomialTree.h"
class BinomialNode
{
    public: 
        int k;
        BinomialNode *children[20];
        int data;
        
        BinomialNode();
};
#endif

二项式节点.cpp

class BinomialNode
{   
    BinomialNode::BinomialNode(int n)
    {   
        this->k = 0;
        this->data = n;
    }
}

二项式树.h

#ifndef _MULTIMAP_H_
#define _MULTIMAP_H_
#include "BinomialNode.h"
class BinomialTree
{
    public:
        BinomialNode * BQ[20];
        
        void insert(int n);
        void merge(BinomialNode *queue, BinomialNode *in, int k);
        void print(BinomialNode *root, int tab);
};
#endif

二项式树.cpp

#include "BinomialNode.h"
#include "BinomialTree.h"
#include <iostream>
#include <cstdlib>

class BinomialTree
{
    void BinomialTree::insert(int n)
    {
        BinomialNode *in = new BinomialNode(n);
        if(BQ[0] == NULL)
        {
            BQ[0] = in;
            return;
        }
        else
            merge(BQ[0], in, 0);
    }
    void BinomialTree::merge(BinomialNode *queue, BinomialNode *in, int k)
    {
        if(queue == NULL)
        {
            BQ[k] = in;
            return;
        }
        if(n == NULL)
        {
            BQ[k] = queue;
            return;
        }
        if(queue->data > in->data)
        {   
            merge(in, queue);
            return;
        }
        queue->k++;
        BinomialNode* temp[queue->k];
        int i;
        for(i = 0; i < queue->k-1; i++)
            temp[i] = queue->children[i];
        temp[queue->k-1] = in;
        for(i = 0; i < queue->k; i++)
            queue->children[i] = temp[i];
        if(BQ[queue->k] == NULL)
        {
            BQ[queue->k] = queue;
            return;
        }
        else
            merge(queue, BQ[queue->k]);
    }
    void BinomialTree::print(BinomialNode *root, int tab)
    {
        if(root == NULL)
            return;
        int i;
        for(i = 0; i < tab*5; i++) cout << " ";
        cout << root->data << endl;
        for(i = 0; i < root->k; i++) print(root->children[i], tab+1);
    }
}

cpp 文件中不应该包含 class。它们应该看起来更像:

二项式节点.cpp

#include "BinomialNode.h"
BinomialNode::BinomialNode(int n) :
  k(0)
{
  data = n;
}

当然,还有更长的二项式树的推论.cpp。此外,您应该使用以下内容对其进行编译:

g++ BinomialTree.cpp BinomialNode.cpp Asg5.cpp -o asg5

此外,您的代码还会遇到许多其他问题。例如:

BinomialNode * BQ[20];

我没有看到 BQ 在任何地方被初始化,这意味着如果你要运行它,你几乎可以保证出现 seg 错误。您需要初始化或分配它。看到这样的行:

if(BQ[0] == NULL)

让我觉得你真的想要:

BinomialNode BQ[20];

尽管您仍然需要将其初始化为所有 NULL,因为不能保证在运行程序时会充满 NULL。此外,这是递归和无限的,不可能工作(在 BinomialNode.h 中):

BinomialNode *children[20];

这段代码可能还有更多问题,但这不是你的问题,所以我现在就停下来!

您需要

将所有.cpp文件编译到一个程序中。 您现在没有在任何地方使用BinomialTree.cpp。 如果您的项目要求您只需键入g++ Asg5.cpp那么您需要#include.cpp文件或将其内容移动到 .h 文件中。 但正常的解决方案是将所有.cpp文件构建在一起,而不仅仅是包含main()的文件。