2012-09-08 25 views
3

未定义的引用我的问题已从我发布的另一个更改。我开始使用多个文件,并决定将其全部放在一个main.cpp文件中,以便使其工作。C++对`vtable

main.cpp中:

#include <iostream> 
using namespace std; 

class arrayListType { 
    public: 
     bool isEmpty() ; 
     bool isFull() ; 
     int listSize() ; 
     int maxListSize() ; 
     void print() ; 
     bool isItemAtEqual(int location, int item) ; 
     virtual void insertAt(int location, int insertItem) = 0; 
     virtual void insertEnd(int insertItem) = 0; 
     void removeAt(int location); 
     void retrieveAt(int location, int& retItem) ; 
     virtual void replaceAt(int location, int repItem) = 0; 
     void clearList(); 
     virtual int seqSearch(int searchItem) const = 0; 
     virtual void remove(int removeItem) = 0; 
     arrayListType (int size = 100); 
     arrayListType (arrayListType& otherList); 
     virtual ~arrayListType(); 
    protected: 
     int *list; 
     int length; 
     int maxSize; 
}; 


bool arrayListType::isEmpty() { 
    return (length == 0); 
} 
bool arrayListType::isFull() { 
    return (length == maxSize); 
} 
int arrayListType::listSize() { 
    return length; 
} 
int arrayListType::maxListSize() { 
    return maxSize; 
} 
void arrayListType::print() { 
    for (int i = 0; i < length; i++) 
     cout << list[i] << " "; 
    cout << endl; 
} 
bool arrayListType::isItemAtEqual(int location, int item) { 
    if (location < 0 || location >= length) { 
     cout << "The location of the item to be compared is out range." << endl; 
     return false; 
    } 
    else 
     return(list[location] == item); 
} 


void arrayListType::removeAt(int location) { 
    if (location < 0 || location >= length){ 
     cout << "The location of the item to be removed is out of range." << endl; 
    } 
    else { 
     for (int i = location; i < length -1; i++) 
      list[i] = list[i+1]; 
     length--; 
    } 
} 
void arrayListType::retrieveAt(int location, int& retItem) { 
    if (location < 0 || location >= length) { 
     cout << "The location of the item to be retrieved is out of range." << endl; 
    } 
    else 
     retItem = list[location]; 
} 


void arrayListType::clearList() { 
    length = 0; 
} 


arrayListType::arrayListType (int size) { 
    if (size <= 0) { 
     cout << "The array size must be positive. Creating an array of the size 100." << endl; 
     maxSize = 100; 
    } 
    else 
     maxSize = size; 
    length = 0; 
    list = new int[maxSize]; 
} 

class orderedArrayListType: public arrayListType { 

    public: 
     void insertAt(int location, int insertItem); 
     void insertEnd(int insertItem); 
     void replaceAt(int location, int repItem); 
     int seqSearch(int searchItem) const; 
     void insert (int insertItem); 
     void remove (int removeItem); 
     orderedArrayListType (int size = 100); 
     ~orderedArrayListType(); 
    private: 
     void quickSort(); 
}; 



void orderedArrayListType::quickSort(){ 
//private function for sorting "list." 
//using a "quicksort" method 
//addapted from: http://www.algolist.net/Algorithms/Sorting/Quicksort 
    if (length == 0) { 
     cout << "Cannot sort an ampty list." << endl; 
    } 
    else { 
     int left = 0, right = length; 
     int i = left, j = right; 
    int tmp; 
    int pivot = list[(left + right)/2]; 
    /* partition */ 
    while (i <= j) { 
     while (list[i] < pivot) 
      i++; 
     while (list[j] > pivot) 
      j--; 
     if (i <= j) { 
      tmp = list[i]; 
      list[i] = list[j]; 
      list[j] = tmp; 
      i++; 
      j--; 
     } 
    }; 
    /* recursion */ 
    if (left < j) 
     quickSort(); 
    if (i < right) 
     quickSort(); 
    } 
} 




void orderedArrayListType::insertAt(int location, int insertItem){ 

    if (location < 0 || location >= length){ 
     cout << "The location of the item to be removed " 
     << "is out of range." << endl; 
    } 
    else if(length == maxSize){ 
     cout << "Cannot insert in a full list." << endl; 
    } 
    else { 
     for (int j = length; j < location; j--){ 
      list[j+1] = list[j]; 
      /* 
      Start at the end of the array and move each item 
      out by one. Coninue until list[j] is at the 
      location, then set the list[location] to the value. 
      */ 
     } 
     list[location] = insertItem; 
     length++; 
    } 
    quickSort(); 
} 

void orderedArrayListType::insertEnd(int insertItem) { 

    if (length == maxSize){ 
     cout << "Cannot insert in a full list." << endl; 
    } 
    else { 
     list[length] = insertItem; 
     length++; 
    } 
    quickSort(); 
} 


void orderedArrayListType::replaceAt(int location, int repItem) { 
    if (location < 0 || location >= length){ 
     cout << "The location of the item to be replaced " 
     << "is out of range." << endl; 
    } 
    else 
     list[location] = repItem; 
    quickSort(); 
} 

int orderedArrayListType::seqSearch(int searchItem) const { 

    int loc; 
    bool found = false; 
    loc = 0; 
    while (loc < length && !found) { 
     if (list[loc] == searchItem) 
      found = true; 
     else 
      loc++; 
    } 
    if (found) 
     return loc; 
    else 
     return -1; 
} 


void orderedArrayListType::insert (int insertItem){ 
    if (length == 0){ 
     list[length++] = insertItem; 
    } 
    else if (length == maxSize){ 
     cout << "Cannot insert in a full list." << endl; 
    } 
    else { 
     int loc; 
     bool found = false; 
     for (loc= 0; loc < length; loc++){ 
      if (list[loc] >= insertItem){ 
       found = true; 
       break; 
      } 
     } 
     for (int i = length; i > loc; i--) { 
      list[i] = list[i-1]; 
     } 
     list[loc] = insertItem; 
     length++; 
    } 
    quickSort(); 
} 
void orderedArrayListType::remove (int removeItem) { 

    int loc; 

    if (length == 0) 
     cout << "Cannot Delete from an ampty list." << endl; 
    else { 
     loc = seqSearch(removeItem); 
     if (loc != -1) 
      removeAt(loc); 
     else 
      cout << "The item to be deleted is not in the list." << endl; 
    } 
} 


orderedArrayListType::orderedArrayListType (int size) 
    :arrayListType(size){ 
} 





int main() { 

// orderedArrayList intlist(25); 
// orderedArrayListType intList = new orderedArrayListType(25); 
} 

确切的错误消息:

/tmp/ccdTFaE0.o:在功能arrayListType::arrayListType(int)': main3.cpp:(.text+0x25c): undefined reference to虚函数表为 arrayListType” /tmp/ccdTFaE0.o :(.rodata._ZTV20orderedArrayListType [vtable for orderedArrayListType] +0
x38):undefined reference to orderedArrayListType::~orderedArrayListType()' /tmp/ccdTFaE0.o:(.rodata._ZTV20orderedArrayListType[vtable for orderedArrayListType]+0
x40): undefined reference to
orderedArrayListType ::〜orderedA rrayListType() ' /tmp/ccdTFaE0.o:(.rodata._ZTI20orderedArrayListType[typeinfo为 orderedArrayListType]
+ 0×10):未定义参考`所属类别为arrayListType' collect2:LD返回1个退出状态

tldr;

#include <iostream> 
using namespace std; 

class arrayListType { 
    public: 
     bool isEmpty() const; 
       ... 
       arrayListType (int size = 100); 
     arrayListType (arrayListType& otherList); 
     virtual ~arrayListType(); 
    protected: 
     int *list; 
     int length; 
     int maxSize; 
}; 


//definitions 
bool arrayListType::isEmpty() { 
    return (length == 0); 
} 

class orderedArrayListType: public arrayListType { 

    public: 
     void insertAt(int location, int insertItem); 
     ... 
     orderedArrayListType (int size = 100); 
     ~orderedArrayListType(); 
    private: 
     void quickSort(); 
}; 



void orderedArrayListType::quickSort(){ 
... 
} 




void orderedArrayListType::insertAt(int location, int insertItem){ 

     ....  

    quickSort(); 
} 

    orderedArrayListType::orderedArrayListType (int size) 
    :arrayListType(size){ 
} 


int main() { 

    orderedArrayList intlist(25); 
// orderedArrayListType intList = new orderedArrayListType(25); 
} 
+1

说真的 - 你要我为你调试263个LOC--把这个例子减少到我可以被困扰的地方 –

+2

听起来像是一个缺少的析构函数定义。 –

+0

很抱歉,我把它写成10行,最后一个问题我问他们说是发布真正的代码...我将编辑 – Jeff

回答

4

你使用什么编译器? Visual Studio 2010中给出了这样更有利于输出:

1> cachesize.obj:错误LNK2019:解析的外部符号 “市民:虚拟__thiscall arrayListType ::〜arrayListType(无效)”(?? 1arrayListType @@ UAE @ XZ )在函数引用 “公共:虚拟无效* __thiscall arrayListType ::`标量删除析构函数”(无符号整数)“(?? _ @@ GarrayListType @ UAEPAXI Z)

1> cachesize.obj:错误LNK2019:解析外部符号“public:virtual __thiscall orderedArrayListType ::〜orderedArrayListType(void)”(?? 1orderedArrayListType @@ UAE @ XZ)在函数“public:virtual void * __thiscall orderedArrayListType ::`scalar deletion destructor'(uns 1> C:\ Users \ james \ Documents \ Visual Studio 2010 \ Projects \ cachesize \ Debug \ cachesize.exe:致命错误LNK1120:2个未解析的外部设备

您需要将机构添加到virtual ~arrayListType();~orderedArrayListType();
你已经声明了它们,但没有定义它们。它编译然后!

+0

编译!现在,如果我试图解开“orderedArrayList intlist(25);”行中的“int main()”出错了。 – Jeff

+1

@Jeff它应该是'orderedArrayListType' – James

+0

Nevermind .... typo .... – Jeff

6

你错过了析构函数的定义:

arrayListType::~arrayListType() { } 

orderedArrayListType::~orderedArrayListType() { } 

链接错误,通常不是非常有用。但是这个确切的错误通常是在你声明但不定义你的析构函数时产生的。

+1

通常,在声明方法但未定义的情况下,可能会获得此错误。 – gantzer89