Speicher für unbekannte Template-Klasse (2)
-
Das übergeben musst du anders machen:
Zu diesem Zeitpunkt musst du aber schon wissen was Klasse ist.
int Main::CreateDynamicArrayInterface(DynamicArray<Klasse> *ppDynamicArray) { //... return OK; }
Dynamisch geht dies mit einer Templatefunktion
template<typename t> int Main::CreateDynamicArrayInterface(DynamicArray<t> *ppDynamicArray) { //... return OK; }
-
@Shade: Ich habe eine Klasse für ein dynamisches Array geschrieben, welches typenunabhängig sein soll (daher Templates). Die interne Struktur meines Programms hat was von COM - ich erstelle Unterklassen aus einer Funktion der Oberklasse heraus. Die Oberklasse ist die hier abgedruckte 'Main' und die Klasse DynamicArray soll erstellt werden ...
@MaSTaH: Erstmal danke, die Idee ist super (warum bin ich da nicht selbst drauf gekommen ), aber wenn ich die Funktionsdefinition (die Funktion hab ich erstmal auskommentiert) so abändere ...
template <typename t> int Main::CreateDynamicArrayInterface(LP_DYNAMIC_ARRAY<t> *ppDynamicArray)
... bringt der Compiler folgenden Fehler: "CreateDynamicArrayInterface' : Ist kein Element von 'Main'" :(.
Wenn ich jedoch wie von dir genannt, die statische Variante wähle funktionierts.M.T.
[ Dieser Beitrag wurde am 05.04.2003 um 16:00 Uhr von Manuel editiert. ]
-
Original erstellt von Manuel:
**@MaSTaH: Erstmal danke, die Idee ist super (warum bin ich da nicht selbst drauf gekommen ), aber wenn ich die Funktionsdefinition (die Funktion hab ich erstmal auskommentiert) so abändere ...template <typename t> int Main::CreateDynamicArrayInterface(LP_DYNAMIC_ARRAY<t> *ppDynamicArray)
... bringt der Compiler folgenden Fehler: "CreateDynamicArrayInterface' : Ist kein Element von 'Main'" :(.
Wenn ich jedoch wie von dir genannt, die statische Variante wähle funktionierts.
**Bringt der den Fehler beim Aufrufen der Funktion? Template-Funktionen ruft man etwas anders auf...
// Beispiel zum Aufruf int sonstwas = Main::CreateDynamicArrayInterface<Klasse>(ppDynamicArray)
Durch die eckigen Klammern gibst du der Funktion die Templateparameter mit...
-
Nein, er bringt den Fehler bei der Funktionsdeklaration in der Klasse.
M.T.
-
Hast du auch im Header der Datei das template vor die Funktion gesetzt?
-
@MaSTaH: Ja, ... könntest du dir die Datei mal kurz durchschauen, wenn ich sie dir als Mail schicke?
M.T.
-
Poste sie doch hier
-
Guten Morgen,
ich poste mal das Wesentliche ...//DynamicArray.h //Klassen-Dummy template <class type> class DynamicArray; //Einen Datentyp für die Klasse erstellen -> siehe Link im voherigen Thread template <class type> struct LP_DYNAMIC_ARRAY { typedef DynamicArray<class type>* Array; }; template <class type> class EXPORT DynamicArray { //Funktionen }; //Main.h //Ein Array-Interface erstellen template <typename type> int CreateDynamicArrayInterface(LP_DYNAMIC_ARRAY<type> *ppDynamicArray) { //Speicher für die Array-Klasse bereitstellen *ppDynamicArray = new DynamicArray; if(!(ppDynamicArray)) { //Nicht genügend Speicher vorhanden return OUT_OF_MEMORY; } (*ppDynamicArray)->m_pEngineMain = this; return OK; } //Aufruf in der Main.cpp LP_DYNAMIC_ARRAY<int> array; this->CreateDynamicArrayInterface(&array); array.Array-> //Fehler !!!
Wenn ich jetzt in der Main.h Speicher allokalisieren möchte, bekomm ich nen Fehler, egal, wo ich das '<type>' hinschreibe
Und als Zweites kann man die Funktionen der initialisierten Klasse nicht Aufrufen - auch nicht über den (dummen) Weg über die StrukturM.T.
[ Dieser Beitrag wurde am 06.04.2003 um 09:59 Uhr von Manuel editiert. ]
-
Der Fehler kommt weil Array ein typedef ist und kein Objekt
-
Lösungsvorschlag?
BTW: Genau so stand s aber in dem Artickel
M.T.
-
Warum eigentlich LP_DYNAMIC_ARRAY? Arbeite lieber sofort mit DynamicArray anstatt das noch in ne struct zu packen. Dann dürfte das laufen. Du setzt LP_DYNAMIC_ARRAY mit DynamicArray gleich...
-
LP_DYNAMIC_ARRAY ist ein DynamicArray*
Ich benutze das, weil es 1. als Datentyp cooler klingt , 2. weil ich den '.' für Klassen nicht mag und lieber '->' verwende, 3. weil ich s.o. ein System verwende indem man der Oberklasse einen Doppelpointer auf die Unterklasse übergibt und somit Speicher dafür bereitgestellt wird und als 4. und letzten Grund, damit die Klasse eine Release-Funktion zum besseren Arbeiten haben kann muss es ein DynamicArray* sein.
Es muss doch eine Möglichkeit geben für Templates ein typedef zu benutzen
M.T.
[ Dieser Beitrag wurde am 06.04.2003 um 13:49 Uhr von Manuel editiert. ]
-
Klar kannst du für Templates ein Typedef benutzen:
typedef vector<Test> Testvector;
So wie ich das sehe ist LP_DYNAMICARRAY eine Struct mit einem typedef drin. Hast du jedenfalls so gepostet:
template <class type> struct LP_DYNAMIC_ARRAY { typedef DynamicArray<class type>* Array; };
Ich verstehe den Sinn dahinter nicht...
-
Das mit dem typedef und einem fest definiertem Datentyp ist mir schon klar, ich möchte den erstellten Datentyp abe wie folgt verwenden:
LP_DYNAMIC_ARRAY<int> array; this->CreateDynamicArrayInterface(&array)
... und das mit der Struktur - den Sinn dahinter versteh ich selbst nicht ganz , aber folgender Artickel sagt, dass es so funktionieren müsste: http://www.gotw.ca/gotw/079.htm .
M.T.
-
so sollte es funktionieren:
LP_DYNAMIC_ARRAY<int>::Array array;
-
du kannst keine template typedefs machen, aber typedefs auf templates sind in Klassen /also auch in Strukturen\ erlaubt, also packst du das einfach in die Klasse /o. Struktur\ rein.
-
Ich hab s geschafft - danke allen, die mir geholfen haben ...
M.T.