2014-02-13 2 views
0

Я новичок в программировании, и я пытаюсь реализовать простую версию ArrayList. Я получаю сообщение об ошибке, и когда я попытался найти решение, люди сказали, что это потому, что конструктор был объявлен, но не реализован. Я реализовал все конструкторы, объявленные в заголовке, поэтому я не уверен, что случилось. Некоторые советы оценили!Ошибка в C++; Невыполненные конструкторы?

Ошибка 1 Ошибка LNK2019: неразрешенный внешний символ "общественности: __thiscall ArrayList :: ArrayList (аннулируются)" (? ?? 0 $ ArrayList @ H @@ QAE @ XZ) ссылки в функции _main

ошибка 2 ошибки LNK2019: неразрешенный внешний символ "общественность: недействительный __thiscall ArrayList :: добавить (INT)" ссылка в функции _main

ошибки 3 ошибка LNK1120 (добавить @ $ ArrayList @ H @@ QAEXH @ Z?) : 2 неразрешенных внешних источника

ArrayList.h

#pragma once 
#ifndef ArrayList_h 
#define ArrayList_h 
#include <stdexcept> 
using namespace std; 

template <class T> 
class ArrayList 
{ 
public: 
    ArrayList(); 
    ~ArrayList(); 
    void add(T item); 
    void expandArray(); 
    T get(int index); 

private: 
    int size; 
    int length; 
    T* list; 
}; 

#endif 

//ArrayList.cpp 
#include "ArrayList.h" 

template <class T> 
ArrayList<T>::ArrayList(){ 
    size=1; 
    length=0; 
    list = new T(size); 
    for(int x=0; x<size;x++){ 
     list[x]=NULL; 
    } 

} 

template <class T> 
ArrayList<T>::~ArrayList(){ 
    delete[] list; 
} 


template <class T> 
void ArrayList<T>::add(T item){ 
    if(length>=size){ 
     expandArray(); 
    } 
    list[length]=item; 
    length++; 
} 

template <class T> 
void ArrayList<T>::expandArray(){ 
    size*=2; 
    T* temp = new T(size); 
    for(int x=0;x<size;x++){ 
     temp[x]=NULL; 
    } 
    for(int x=0;x<length;x++){ 
     temp[x]=list[x]; 
    } 
    delete[] list; 
    list=temp; 
} 

template <class T> 
T ArrayList<T>::get(int index){ 
    if(index>length||index<0){ 
     throw out_of_range("Index out of bounds!"); 
    } 
    return list[index]; 
} 

main.cpp

#include "ArrayList.h" 


int main(){ 

    ArrayList<int>* list = new ArrayList<int>(); 

    for(int x=0; x<=30;x++){ 
     list->add(x); 
    } 

    return 0; 
} 

ответ

4

определения шаблона должны быть в файле заголовка. Переместите определение конструктора ArrayList<T>::ArrayList в ArrayList.h.

+0

Прошу прощения, я все еще относительно новичок в C++ и заголовках. Я просто перемещаю всю реализацию ArrayList :: ArrayList в заголовок? Я думал, что заголовки должны использоваться только для деклараций. – user3272701

+0

@ user3272701 Целый класс шаблона должен находиться в заголовке. Для классов без шаблонов вы будете правы. – KitsuneYMG

+0

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

Смежные вопросы