Archief - C++ Netbeans undefined reference

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Curahee Q

Legacy Member
Ik ben bezig in Netbeans een ArrayList te maken (met hetzelfde gedrag als deze in Java).

Eerst had ik dit al gemaakt enkel voor doubles, en dit werkte goed. Nu probeer ik met een template te werken en geeft hij undefined reference.

main.cpp (Source Files)
Code:
#include <iostream>
#include "ArrayList.h"
using namespace std;

int main(int argc, char** argv) {
    ArrayList<double> l;

    return 0;
}

ArrayList.h (Header Files)
Code:
#ifndef _ARRAYLIST_H
#define	_ARRAYLIST_H

template <class T>
class ArrayList {
    public:
        ArrayList();
        ArrayList(int capacity);

        int capacity() const;
        int size() const;

        void add(T x);
        T get(int i) const;
        void set(int i, T x);
        void clear();

        bool is_empty() const;
        void schrijf(char delimiter) const;

    private:
        int m_capacity;
        int m_size;
        T* data;
};

#endif

ArrayList.cpp (Header Files)
Code:
#include <iostream>
#include "ArrayList.h"

template <class T>
ArrayList<T>::ArrayList() {
    m_capacity = 10;
    m_size = 0;

    data = new T[m_capacity];
}

template <class T>
ArrayList<T>::ArrayList(int capacity) {
    if(capacity <= 0) {
        throw "Capaciteit moet groter zijn dan 0!";
    }

    m_capacity = capacity;
    m_size = 0;

    data = new T[m_capacity];
}

template <class T>
int ArrayList<T>::capacity() const {
    return m_capacity;
}

template <class T>
int ArrayList<T>::size() const {
    return m_size;
}

template <class T>
void ArrayList<T>::add(T x) {
    if(m_capacity == m_size) {
        m_capacity *= 2;

        T* arr = new T[m_capacity];

        for(int i=0; i<m_size; i++) {
            arr[i] = data[i];
        }

        delete[] data;
        
        data = arr;
    }

    data[m_size] = x;

    ++m_size;
}

template <class T>
T ArrayList<T>::get(int i) const {
    if(i < 0 || i >= m_size) {
        throw "Array index out of bounds!";
    }

    return data[i];
}

template <class T>
void ArrayList<T>::set(int i, T x) {
    if(i < 0 || i >= m_size) {
        throw "Array index out of bounds!";
    }

    data[i] = x;
}

template <class T>
void ArrayList<T>::clear() {

}

template <class T>
bool ArrayList<T>::is_empty() const {
    return m_size==0;
}

template <class T>
void ArrayList<T>::schrijf(char delimiter=' ') const {
    for(int i=0; i<m_size-1; i++) {
        std::cout << data[i] << delimiter;
    }

    std::cout << data[m_size-1];
}

Error
Code:
/usr/bin/make -f nbproject/Makefile-Debug.mk SUBPROJECTS= .build-conf
make[1]: Map '/home/sam/NetBeansProjects/CppApplication_1' wordt binnengegaan
/usr/bin/make  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/cppapplication_1
make[2]: Map '/home/sam/NetBeansProjects/CppApplication_1' wordt binnengegaan
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/ArrayList.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/ArrayList.o.d -o build/Debug/GNU-Linux-x86/ArrayList.o ArrayList.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/cppapplication_1 build/Debug/GNU-Linux-x86/ArrayList.o build/Debug/GNU-Linux-x86/main.o  
build/Debug/GNU-Linux-x86/main.o: In function `main':
/home/sam/NetBeansProjects/CppApplication_1/main.cpp:16: undefined reference to `ArrayList<double>::ArrayList(int)'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cppapplication_1] Fout 1
make[2]: Map '/home/sam/NetBeansProjects/CppApplication_1' wordt verlaten
make[1]: *** [.build-conf] Fout 2
make[1]: Map '/home/sam/NetBeansProjects/CppApplication_1' wordt verlaten
make: *** [.build-impl] Fout 2
BUILD FAILED (exit value 2, total time: 180ms)

Curahee Q

Legacy Member
Bedankt, heb nu zowel mijn implementatie als declaratie in ArrayList.h gestoken. Bedankt ook voor de link.

forloRn_

Legacy Member
Tips: een default argument zetten in je constructor en je array deleten.

Curahee Q

Legacy Member
Wat bedoel je juist forloRn_?

Als ik dit doe
Code:
template <class T>
ArrayList<T>::ArrayList(int capacity=10) {
    if(capacity <= 0) {
        throw "Capaciteit moet groter zijn dan 0!";
    }

    m_capacity = capacity;
    m_size = 0;

    data = new T[m_capacity];
}

Kan ik deze niet aanroepen met

ArrayList<string> l;

Array deleten gebeurd in de destructor die ondertussen wel is geprogrammeerd.

Tyfius

Legacy Member
Nocturn zei:
Wat bedoel je met "moet"?

Ik snap ook wel de realiteit van wat je zegt, maar het is niet omdat ik maar weet heb van slechts 1 c++ compiler die de standaard op deze manier volgt dat je kunt concluderen dat het "moet". :-/
Moeten is een groot woord. Alternatieve oplossingen worden op die FAQ pagina ook gegeven, maar ik heb al ondervonden dat het meestal gewoon handiger is van die in uw header file te doen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan