C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Derefernzieren von Zeiger auf Template-Objekt

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Jan Boehme
Guest





PostPosted: Mon Dec 13, 2004 9:36 am    Post subject: Derefernzieren von Zeiger auf Template-Objekt Reply with quote



Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?
Danke, Jan.


template <typename T, int N> struct A
{
void Render() { //... }
};

struct B
{
void *pA;
template <typename T, int N> void SetA(A<T,N> &_a)
{
pA = &_a;
}

int Render()
{
(?CAST?(pA))->Render();
}
};

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Michael Karcher
Guest





PostPosted: Tue Dec 14, 2004 12:32 pm    Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt Reply with quote



Jan Boehme <aiscape (AT) hotmail (DOT) com> wrote:
Quote:
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Es ist nicht unbedingt nötig, den konkreten Typ von T zu kennen. Man kann

hier virtuelle Funktionen und Templates möglicherweise gewinnbringend
kombinieren:

Quote:
template <typename T, int N> struct A
{
void Render() { //... }
};

class Renderable {
public:
virtual void Render() = 0;
};

template <typename T, int N> struct A : public Renderable {
virtual void Render() { /*...*/ }
};

Quote:
struct B
{
Renderable * pA

[SetA unverändert]
Quote:
int Render()
{
pA->Render();
}
};

Michael Karcher

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Olaf Krzikalla
Guest





PostPosted: Tue Dec 14, 2004 1:28 pm    Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt Reply with quote



Hi,

Jan Boehme schrieb:
Quote:
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist.
Bis hierhin würde ich dem Template A einfach eine Basisklasse mit

virtueller Render-Methode verpassen. Aber...

Quote:
Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Sieht schlecht aus. Statisch kann das schonmal nicht gehen, da ja zur

Compilezeit für ein B-Objekt nicht klar ist, ob und wie oft und v.a. mit
welchem T SetA aufgerufen wird. Also mußt Du den Typ dynamisch in pA
verpacken (er bezieht sich dann immer auf den letzten Aufruf von SetA).
Und da kommt es jetzt auf das exakte Problem an, da ja T aus einem void*
auch nicht so einfach wieder rausextrahiert werden kann.


MfG
Olaf Krzikalla

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Kaul
Guest





PostPosted: Tue Dec 14, 2004 3:21 pm    Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt Reply with quote

Jan Boehme wrote:
Quote:
Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?

Wie Olaf schon gesagt hat, Basisklasse von A mit virtueller Render
Methode erzeugen.

Allerdings verstehe ich den zweiten Punkt nicht. Warum musst du
klassenweit den Typ von T bekannt machen. Der Pointer pA der Klasse B
sollte ein Pointer auf die Basisklasse sein. Dann wird die korrekte
Render() Methode aufgerufen, d.h. das Wissen, von welchem Typ T konkret
ist, wird nicht benötigt.

tschaule
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Tue Dec 14, 2004 5:48 pm    Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt Reply with quote

Jan Boehme wrote:

Quote:
Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?

Du könntest aus pA einen Zeiger auf eine Funktion machen, die bereits
alle Parameter kennt: (habs nicht getestet, das Prinzip sollte klar werden)

Quote:

template <typename T, int N> struct A
{
void Render() { //... }
};

template <typename T, int N , struct A
void call()
{
a.Render();
}

Quote:
struct B
{
void (*pA)();
template <typename T, int N> void SetA(A<T,N> &_a)
{
pA = call<T,N,_a>;
}

int Render()
{
pA();
}
};



mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Tue Dec 14, 2004 6:08 pm    Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt Reply with quote

Torsten Robitzki wrote:

Quote:
Jan Boehme wrote:

Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte
ich noch schnell fragen, ob es für den Aufruf von B::Render eine
andere Lösung gibt, als dass B ebenfalls ein template ist. Es wäre
nötig, über B::SetA klassesnweit bekannt zu machen, von welchem Typ T
ist.
Gibt es dafür einen Trick/Mechanismus?


Du könntest aus pA einen Zeiger auf eine Funktion machen, die bereits
alle Parameter kennt: (habs nicht getestet, das Prinzip sollte klar werden)

Quatsch, vergiss es Smile Die Adresse von struct A<T,N> wird wohl kaum zur
Compilezeit bekannt sein. (es wären also zwei Zeiger nötig)

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.