Hallo zusammen,
seit letztem Wochenende hänge ich mal wieder in den Untiefen des C/C++ fest. Also folgendes:
Kurz zusammengefasst bekomme ich es einfach nicht hin die Deklaration der Klasse und deren Member von deren Definition zu trennen.
Ich möchte in die Header Datei Array.h nur die Deklaration der Template Klasse schreiben, wie ich es aus meinen frühen Anfängen gewohnt bin. Die Definition erfolgt dann in der dazu gehörigen CPP Datei. Bei "normalen" Klassen habe ich das Problem nicht. Das Kompilieren funktioniert, das Linken geht auch fehlerfrei. Wenn ich jetzt aber die Template Klasse "Array" nach dem selbigen Schema trenne, dann bekomme ich stets für jeden Member den ich im restlichen Programm-Code verwende mindestens einen Fehler beim Linken (das Kompilieren zeigt erstmal keine Fehler, bin jedoch noch nicht soweit gegangen den Compiler auf pedantisch ... einzustellen):
Wenn ich exakt den gleichen Code der Array.cpp Datei ans Ende der Datei Array.h verschiebe, dann ist selbst das Linken ohne Fehler und das Programm läuft erstmal wie gewünscht.
Hier beide Dateien
Array.h:
Array.cpp:
Als Entwicklungsumgebung verwende ich Visual Studio 2005 und dessen Compiler.
Falls euch noch etwas an Input fehlen sollte, dann schreibt welche Infos ihr bräuchtet.
Vorerst helfe ich mir damit, dass ich eben alles in die Header Dateien packe. Jedoch ist das nach meinem Verständniss nicht wirklich der Sinn der Sache.
Ich würde jetzt mal vermuten, dass ich unbewußt die template Definition in der CPP Datei "überschreibe" und deswegen der Linker nicht weiß, welchen Code er nun wie linken soll.
Danke schon mal dafür, dass ihr bis jetzt durchgehalten und meine Beschreibung des Problems gelesen habt.
Viele Grüße
Rossibaer
PS: Bitte keine Tipps ala Google ist dein Freund, weil ich genau diesen "Freund" verwendete um überhaupt die Deklaration von der Definition zu trennen. Der "Stroustrup" hat mich ebenfalls erfolgreich abgehängt bzw. mehr Fragen als Antworten geliefert...
seit letztem Wochenende hänge ich mal wieder in den Untiefen des C/C++ fest. Also folgendes:
Kurz zusammengefasst bekomme ich es einfach nicht hin die Deklaration der Klasse und deren Member von deren Definition zu trennen.
Ich möchte in die Header Datei Array.h nur die Deklaration der Template Klasse schreiben, wie ich es aus meinen frühen Anfängen gewohnt bin. Die Definition erfolgt dann in der dazu gehörigen CPP Datei. Bei "normalen" Klassen habe ich das Problem nicht. Das Kompilieren funktioniert, das Linken geht auch fehlerfrei. Wenn ich jetzt aber die Template Klasse "Array" nach dem selbigen Schema trenne, dann bekomme ich stets für jeden Member den ich im restlichen Programm-Code verwende mindestens einen Fehler beim Linken (das Kompilieren zeigt erstmal keine Fehler, bin jedoch noch nicht soweit gegangen den Compiler auf pedantisch ... einzustellen):
Code:
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@UAE@XZ)" in Funktion ""public: __thiscall Engine::Engine(void)" (??0Engine@@QAE@XZ)". Engine.obj
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall Array<int>::Clear(void)" (?Clear@?$Array@H@@QAEXXZ)" in Funktion ""public: __thiscall Engine::Engine(void)" (??0Engine@@QAE@XZ)". Engine.obj
Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall Array<int>::Add(int)" (?Add@?$Array@H@@QAEXH@Z)" in Funktion ""public: __thiscall Engine::Engine(void)" (??0Engine@@QAE@XZ)". Engine.obj
Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Array<int>::Array<int>(void)" (??0?$Array@H@@QAE@XZ)" in Funktion ""public: __thiscall Engine::Engine(void)" (??0Engine@@QAE@XZ)". Engine.obj
Wenn ich exakt den gleichen Code der Array.cpp Datei ans Ende der Datei Array.h verschiebe, dann ist selbst das Linken ohne Fehler und das Programm läuft erstmal wie gewünscht.
Hier beide Dateien
Array.h:
Code:
#ifndef ARRAY_H
#define ARRAY_H
#include "object.h"
#include "Assert.h"
template <class T> class Array :
public Object
{
public:
Array();
~Array();
void Add(T item);
void Clear();
T GetValue(int index);
void SetValue(int index, T item);
private:
T* content;
int count;
int maxsize;
void Resize(int new_size);
};
#endif
Array.cpp:
Code:
#include "Array.h"
//
template <class T> Array<T>::Array()
{
this->count = 0;
this->content = NULL;
this->Resize(5);
}
//
template <class T> Array<T>::~Array()
{
delete[] this->content;
}
//
template <class T> void Array<T>::Clear()
{
for(int index = 0; index < this->count; index++)
this->content[index] = NULL;
this->count = 0;
}
//
template <class T> void Array<T>::Add(T item)
{
if(this->count == this->maxsize)
this->Resize(this->maxsize * 2);
this->content[this->count++] = item;
}
//
template <class T> T Array<T>::GetValue(int index)
{
assert(index >= 0 && index < this->count);
return this->content[index];
}
//
template <class T> void Array<T>::SetValue(int index, T item)
{
assert(index >= 0 && index < this->count);
this->content[index] = item;
}
//
template <class T> void Array<T>::Resize(int new_size)
{
assert(new_size > 0);
T* temp = new T[new_size];
int index = 0;
if(this->content)
{
for(; index < this->count; index++)
{
temp[index] = this->content[index];
this->content[index] = NULL;
}
}
for(; index < new_size; index++)
temp[index] = NULL;
if(this->content) delete[] this->content;
this->content = temp;
this->maxsize = new_size;
}
//
Als Entwicklungsumgebung verwende ich Visual Studio 2005 und dessen Compiler.
Falls euch noch etwas an Input fehlen sollte, dann schreibt welche Infos ihr bräuchtet.
Vorerst helfe ich mir damit, dass ich eben alles in die Header Dateien packe. Jedoch ist das nach meinem Verständniss nicht wirklich der Sinn der Sache.
Ich würde jetzt mal vermuten, dass ich unbewußt die template Definition in der CPP Datei "überschreibe" und deswegen der Linker nicht weiß, welchen Code er nun wie linken soll.
Danke schon mal dafür, dass ihr bis jetzt durchgehalten und meine Beschreibung des Problems gelesen habt.
Viele Grüße
Rossibaer
PS: Bitte keine Tipps ala Google ist dein Freund, weil ich genau diesen "Freund" verwendete um überhaupt die Deklaration von der Definition zu trennen. Der "Stroustrup" hat mich ebenfalls erfolgreich abgehängt bzw. mehr Fragen als Antworten geliefert...
Zuletzt bearbeitet: