2016-04-22 102 views
0

所以,當我試圖簡單地用「G ++ Asg5.cpp」我收到以下錯誤編譯我的代碼未定義的引用CLASS ::函數()

/tmp/cczhpSGO.o:在功能上的主要「:

Asg5.cpp :(文字+ 0x2fb):未定義的引用 'BinomialTree ::插入(INT)'

collect2: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; 
} 

BinomialNode.h

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

     BinomialNode(); 
}; 
#endif 

BinomialNode.cpp

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

BinomialTree.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 

BinomialTree.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); 
    } 
} 
+0

你錯過了最重要的部分:你如何建立它? – user3159253

回答

0

你的CPP文件不應該有他們的類。他們應該看起來更像:

BinomialNode.cpp

#include "BinomialNode.h" 

BinomialNode::BinomialNode(int n) : 
    k(0) 
{ 
    data = n; 
} 

課程和配套的更長BinomialTree.cpp。此外,你應該編譯它類似於:

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

此外,你會遇到很多其他問題與你的代碼。例如:

BinomialNode * BQ[20]; 

我沒有看到BQ被初始化的任何地方,這意味着你幾乎保障的賽格故障,如果你要運行這個。您需要初始化或分配它。眼看線,如:

if(BQ[0] == NULL) 

讓我覺得你真的想:

BinomialNode BQ[20]; 

雖然你仍然需要,因爲你不能保證,這將是全空值,以將其初始化爲NULL的一切,當你運行程序。此外,這是遞歸的和無限的,也不可能正常工作(在BinomialNode.h):

BinomialNode *children[20]; 

有可能更多的問題與此代碼,但是這不是你的問題,所以我現在就停止!

+0

我很欣賞所有的反饋!我仍然在編寫代碼,只是認爲我會先解決編譯錯誤。 –

+0

哈!有一點被帶走了。至少在我的答案的前幾部分中,你有所進步嗎?你可能想寫一個更簡單的'模板'程序,編譯並開始逐步增加你的實際工作的複雜性,以找出其他問題的位置。 – jbeck

+0

我做到了,事實上我決定完全取消.h文件,只包含cpp(儘管我知道這不是好的做法),因爲它是一個簡單的程序。 –

0

您需要將所有.cpp文件編譯爲一個程序。您目前不在任何地方使用BinomialTree.cpp。如果您的項目需要您輸入g++ Asg5.cpp,那麼您需要#include您的.cpp文件或將其內容移至.h文件。但通常的解決方案是將所有.cpp文件一起構建,而不僅僅是包含main()的文件。