Avatar billede duper Nybegynder
06. december 2001 - 02:07 Der er 3 kommentarer og
1 løsning

Newbie: Linker fejl. Hvad kan jeg gøre?

Hej!

Jeg sidder og laver en opgave i C++, men har nu været gået i stå nogle (mange) timer, da jeg ikke kan slippe af med Linker fejl.

Noget af koden ser måske lidt \"klumpet ud\", men det er noget jeg selv vil tage mig af. Jeg er altså bare ude efter at prøve at få fjernet linker-fejlene, så jeg kan arbejde videre.

Eventuelt ville et forslag til løsningen være godt nok.

Koden ser følgende ud: (Der er en klasse mere, men ud fra Fejl-meddelelserne har den vist intet med det at gøre)
--------------------------
Jeg får følgen Linker Fejl:
[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::~ArrayKlasse<Deltager>()\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::ArrayKlasse<Deltager>(int)\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::Add(Deltager)\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::First()\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::GetData()\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::Next()\' referenced from H:\\VIRKER\\MAIN.OBJ

[Linker Error] Unresolved external \'ArrayKlasse<Deltager>::Length()\' referenced from H:\\VIRKER\\MAIN.OBJ
--------------------------
Main.cpp
#include <vcl.h>
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <cstring>
#pragma hdrstop
using namespace std;
#include \"clDeltager.h\"
#include \"clArrayKlasse.h\"
#pragma argsused

int main(int argc, char* argv[])
{
    ArrayKlasse<Deltager> Tabel;
    Deltager D1(\"Ole Olesen\", \"22344\");
    Deltager D2(\"Kim Jensen\",\"10\");
    cout << D1;
    Tabel.Add(D1);
    for (int i=0;i<6;i++)
        Tabel.Add(D2);
    Tabel.First();
    for (int i=0;i<Tabel.Length();Tabel.Next(),i++)
        cout << Tabel.GetData() << endl;
    getch();
    return 0;
}
-----------------------------------------
clArrayKlasse.h
#ifndef clArrayKlasseH
#define clArrayKlasseH

template<class t>
class ArrayKlasse
{
public:
// Konstruktør
        ArrayKlasse(int Maximum=5);
        ArrayKlasse(const ArrayKlasse & Array);
        ~ArrayKlasse();
//Overloader
        ArrayKlasse operator= (const ArrayKlasse & Array);
        //ostream operator<< (ostream& out, );
// Access metoder
        void Add(t Ny);
        void First();
        void Next();
        bool More();
        int Length();
        t GetData();
private:
    t * Data;
    int Max;
    int Used;
    int PresentPosition;
    void Grow();
};
#endif
--------------------------------------
clArrayKlasse.cpp
#include <vcl.h>
#include <fstream>
#include <iostream>
#include <conio.h>
#include <cstring>
#pragma hdrstop
using namespace std;
#include \"clArrayKlasse.h\"
#pragma package(smart_init)
template<class t>
ArrayKlasse<t>::ArrayKlasse(int Maximum)
{
        Max=Maximum;
        Used=0;
        PresentPosition=0;
        Data = new t[Max];
}

template<class t>
ArrayKlasse<t>::ArrayKlasse(const ArrayKlasse & Array)
{
        Max=Array.Max;
        Used=Array.Used;
        PresentPosition=Array.PresentPosition;
        Data=new t[Max];
        for int i=0;i<Used;i++)
                Data[i]=Array.Data[i];
}

template<class t>
ArrayKlasse<t>::~ArrayKlasse()
{
        delete [] Data;
}
// ******* Overloading ******
template<class t>
ArrayKlasse<t> ArrayKlasse<t>::operator=(const ArrayKlasse & Array)
{
        if (this != &Array)
        {
                delete [] Data;
                Max=Array.Max;
                Used=Array.Used;
                PresentPosition=Array.PresentPosition;
                Data=new t[Max];
                for (int i=0;i<Used;i++)
                        Data[i]=Array.Data[i];
        }
        return *this;
}
// ***** Access metoder *****
template<class t>
void ArrayKlasse<t>::Add(t Ny)
{
        if (Used>=Max)
                Grow();
        Data[Used++]=Ny;
}
template<class t>
void ArrayKlasse<t>::First()
{
        PresentPosition=0;
}
template<class t>
void ArrayKlasse<t>::Next()
{
        PresentPosition++;
}
template<class t>
bool ArrayKlasse<t>::More()
{
        return PresentPosition<Used;
}
template<class t>
int ArrayKlasse<t>::Length()
{
        return Used;
}
template<class t>
t ArrayKlasse<t>::GetData()
{
        return Data[PresentPosition];
}
// ***** Private Metoder *****
template<class t>
void ArrayKlasse<t>::Grow()
{
        Max+=3;
        t * Bigger=new t[Max];
        for (int i=0;i<Used;i++)
                Bigger[i]=Data[i];
        delete [] Data;
        Data=Bigger;
}
--------------------------
Med Venlig Hilsen
/Sune

NB: Jeg bruger Borland C++ Builder v5.0
Avatar billede mickni33 Nybegynder
06. december 2001 - 09:16 #1
Er det noget du har lavet på skolen, og så kopieret over på din egen maskine ?
for så kan det godt gå galt
Avatar billede duper Nybegynder
06. december 2001 - 09:22 #2
Klassen clArrayKlasse er en jeg har fået udleveret og skulle derfor virker, men gør det desværre ikke.

Men har du nogen ide om hvad jeg kan gøre for at få fjernet disse Linker fejl?

Avatar billede stampehansen Nybegynder
06. december 2001 - 16:58 #3
Prøv at include din clArrayKlasse.cpp i din main.cpp  Det er tit at det driller i C++, når man bruger templates. Hvis du ikke giver besked på hvor din kode til templaten er (i .cpp) så ved linkeren ikke hvor koden skal være. Det er IKKE nok at inkludere .h filen. Den siger jo ikke noget om template koden.
Avatar billede duper Nybegynder
06. december 2001 - 17:21 #4
en enkelt #include \"clArrayKlasse.cpp\" og linker fejlen var løst. Så er jeg blevet det klogere til næste gang.

Jeg siger mange for hjælpen :0)

/Sune
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester