конструктор — c ++ неопределенная ссылка на `vtable

Мой вопрос изменился по сравнению с другим, который я опубликовал. Я начал с нескольких файлов и решил поместить все это в один файл main.cpp, чтобы заставить его работать.

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
Vtable для
arrayListType»
/tmp/ccdTFaE0.o:(.rodata._ZTV20orderedArrayListType[vtable для
orderedArrayListType] +0
x38): неопределенная ссылка на
orderedArrayListType::~orderedArrayListType()'
/tmp/ccdTFaE0.o:(.rodata._ZTV20orderedArrayListType[vtable for
orderedArrayListType]+0
x40): undefined reference to
orderedArrayListType :: ~ orderedArrayListType ()»
/tmp/ccdTFaE0.o:(.rodata._ZTI20orderedArrayListType[typetypeinfo для
orderedArrayListType] +0x10): неопределенная ссылка на `typeinfo для 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);
}

3

Решение

Какой компилятор вы используете? 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 OrderArrayListType :: ~ orderArrayListType (void)» (?? 1orderedArrayListType @@ UAE @ XZ) упоминается в функции «public: virtual void * __thiscall orderArrayListType ::` скалярное удаление деструктора ‘(unsigned int) «(?? _ GorderedArrayListType @@ UAEPAXI @ Z)
1> C: \ Users \ james \ Documents \ Visual Studio 2010 \ Projects \ cachesize \ Debug \ cachesize.exe: фатальная ошибка LNK1120: 2 нерешенные внешние проблемы

Вам нужно добавить тела в virtual ~arrayListType(); а также ~orderedArrayListType();,
Вы объявили их, но не определили их. Это компилируется тогда!

4

Другие решения

Вам не хватает определений деструкторов:

arrayListType::~arrayListType() { }

orderedArrayListType::~orderedArrayListType() { }

Ошибки компоновщика обычно не очень полезны. Но эта точная ошибка обычно генерируется, когда вы объявляете, но не определяете свой деструктор.

7

По вопросам рекламы [email protected]