3

我的问题与我发布的另一个问题不同。我从多个文件开始,并决定现在将它们全部放在一个 main.cpp 文件中,以使其正常工作。

主.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 tovtable for arrayListType' /tmp/ccdTFaE0.o:(.rodata._ZTV20orderedArrayListType[vtable for orderedArrayListType]+0
x38):未定义引用 orderedArrayListType::~orderedArrayListType()' /tmp/ccdTFaE0 .o:(.rodata._ZTI20orderedArrayListType[typeinfo for orderedArrayListType] +0x10): undefined reference to `typeinfo for arrayListType' collect2: ld 返回 1 exit statusorderedArrayListType::~orderedArrayListType()' /tmp/ccdTFaE0.o:(.rodata._ZTV20orderedArrayListType[vtable for orderedArrayListType]+0
x40): undefined reference to

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);
}
4

2 回答 2

7

您缺少析构函数定义:

arrayListType::~arrayListType() { }

orderedArrayListType::~orderedArrayListType() { }

链接器错误通常不是很有用。但是,当您声明但不定义您的析构函数时,通常会生成这个确切的错误。

于 2012-09-08T03:07:27.340 回答
4

你用的是什么编译器?Visual Studio 2010 提供了更有用的输出:

1>cachesize.obj : 错误 LNK2019: 无法解析的外部符号“public: virtual __thiscall arrayListType::~arrayListType(void)” (??1arrayListType@@UAE@XZ) 在函数“public: virtual void * __thiscall arrayListType::`标量删除析构函数'(unsigned int)" (??_GarrayListType@@UAEPAXI@Z)

1>cachesize.obj : 错误 LNK2019: 无法解析的外部符号“public: virtual __thiscall orderedArrayListType::~orderedArrayListType(void)” (??1orderedArrayListType@@UAE@XZ) 在函数“public: virtual void * __thiscall orderedArrayListType::`标量删除析构函数'(unsigned int)" (??_GorderedArrayListType@@UAEPAXI@Z) 1>C:\Users\james\Documents\Visual Studio 2010\Projects\cachesize\Debug\cachesize.exe:致命错误 LNK1120:2 未解决外在

您需要将实体添加到virtual ~arrayListType();~orderedArrayListType();
您已声明它们但未定义它们。然后编译!

于 2012-09-08T03:11:31.123 回答