2015-11-20 41 views
0

我無法確定如何解決此問題未定義的引用錯誤。我有類hashTable和它的insertWord(string)函數定義,我調用一個位於向量中的鏈接列表對象的函數。問題是,我得到這個錯誤:從另一個對象調用一個對象的函數時發生C++未定義引用

錯誤:

C:\Users\...\hashTable.o:hashTable.cpp|| undefined reference to `linkedList::linkedList()'| 
C:\Users\...\hashTable.o:hashTable.cpp|| undefined reference to `linkedList::appendNode(std::string)'| 
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===| 

我想這可能是一些做作用域的LinkedList的實例/ Hashtable類中的函數。另外,我有一個linkedList.cpp和一個linkedList.h,它們都工作100%完美(很多測試),所以我不相信顯示linkedList的文字代碼將是有益的。

我的一些代碼:(裸陪我,這是一個有點混亂)

hashTable.h

///hashTable.h 

#ifndef HASHTABLE_H_EXISTS 
#define HASHTABLE_H_EXISTS 

#include <string> 
#include <vector> 

#include "linkedList.h" 

using namespace std; 

//class hashTable 
class hashTable{ 
    private: 
     vector <linkedList> hTable; //our hashTable "storage system" ---> vector of linkedList objects 
    public: 
     hashTable(); 
     hashTable(string); 
     void init_hashTable(); // general initializer function 
     int getIndex(string); //our "hashing" function 
     void loadFile(string); 
     void insertWord(string); // insert word into: vec< LList(word) > 
};//end hashTable def 

#endif 

hashTable.cpp

///hashTable.cpp 

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <ctype.h> 
#include <string> 
#include <vector> 

#include "hashTable.h" 
#include "linkedList.h" 

using namespace std; 

//class hashTable functions 
hashTable::hashTable(){ 
    //constructor 
    hashTable::init_hashTable(); 

}//end constructor 

hashTable::hashTable(string fileName){ 
    //overloaded constructor 
    hashTable::init_hashTable(); 
    hashTable::loadFile(fileName); 

}//end overloaded constructor 

void hashTable::init_hashTable(){ 
    // general inializations 

    // add a linkedList to the vector for each english letter 
    for (int i = 0;i < 26;i++) 
     hashTable::hTable.push_back(linkedList()); 

}//end init_hashTable 

int hashTable::getIndex(string word){ 
    //gets index for hTable 

    // Returns ascii integer value of capitalized 
    // 1st letter minus ascii value of 'A'. 
    return toupper(word.at(0)) - 65; 

}//end getIndex 

void hashTable::loadFile(string fileName){ 
    // loads words by line from file: fileName 

    // our token 
    string token = ""; 

    // input file stream 
    ifstream file; 
    file.open(fileName.c_str()); 

    // while not at endOfFile 
    while (!file.eof()){ 

     // token gets current line/word 
     getline(file, token); 
     // if line is not empty 
     if (token != "") 
      // insert word into hashtable 
      hashTable::insertWord(token); 
    } // end while 

}//end loadFile 

void hashTable::insertWord(string word){ 
    // Appends word to a LinkedList of cooresponding 
    // hash code position in the hTable (a=0,b=1,...,z=25). 

    // get index for LL in hTable 
    int hashCode = hashTable::getIndex(word); 

    // adding the word to our chosen linkedList 
    hashTable::hTable[hashCode].appendNode(word); 

    /* TAKE NOTE:        // 
    \\  hTable[hashCode] is a specific  \\ 
    //  linked list from the hTable vector */ 

}//end insertWord 



// testing harness... 
int main(){ 

    hashTable tbl("words.txt"); 

    return 0; 
}//end main 
+0

您還需要在構建時鏈接鏈接列表對象文件。 –

+0

就像在linkedList.o文件中一樣?我會怎麼做?我知道我包含了linkedList類的頭文件。 – Ibrahim

回答

0

想通了:

1)你可以做一個makefile;例如,我使用PuTTY來完成此操作。

2)因爲我們希望makefile是「無擴展」的,所以在Unix中生成makefile是理想的。

3)這裏是你如何把它寫在此情況下(膩子,用vi編輯器):

vi makefile [PRESS ENTER] 


HT: hashTable.o linkedList.o main.o 
      g++ hashTable.o linkedList.o main.o -o HT 
hashTable.o: hashTable.cpp hashTable.h linkedList.h 
      g++ -c hashTable.cpp 
linkedList.o: linkedList.cpp linkedList.h 
      g++ -c linkedList.cpp 
main.o: main.cpp hashTable.h linkedList.h 
      g++ -c main.cpp 
clean: 
      rm -f *.o 

:wq [PRESS ENTER] // this will save and quit from the vi editor 

基本設置在這裏:

Label: all object files seperated with a space 
     g++ all object files seperated with a space -o Label 
objectFile.o: objectFile.cpp dependencies.h ...etc. 
     g++ -c objectFile.cpp 
//...do above 2 lines for every object file(.o) you have 
clean: 
     rm -f *.o // get rid of extension of your make file 

然後書面方式你的makefile後,你只需在目錄中輸入'make'來運行它。然後你會看到你的標籤(在makefile中使用的標籤)和makefile在同一個目錄下。那麼你只需鍵入這個運行「的所有功能於一身的」方案:./Label

- 編輯 -

如果你不想做一個makefile,你可以defenitely只需鍵入膩子以下內容:

g++ -o HT hashtable.cpp linkedList.cpp main.cpp [PRESS ENTER] 

但是,每次更改代碼而不是makefile時,您都必須輸入此值。

+1

你沒有*有*有一個makefile(雖然這是一個有用的想法),你可以寫'g ++ -o HT hashtable.cpp linkedList.cpp main.cpp' –

+0

@ M.M謝謝!我完全忘記了這一點,因爲我有一段時間沒有使用PuTTY。編輯。 – Ibrahim

相關問題