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 

Template und Klassenhierarchie

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





PostPosted: Thu Jun 17, 2004 11:04 am    Post subject: Template und Klassenhierarchie Reply with quote



Hallo,

gegeben ist eine Klassenhierarchie mit t_obj als Basis (abstrakt
virtuell) und Ableitungen, wie t_obj_1, t_obj_2, usw.

Diese werden in Templates gespeichert, wie z.B. std::list< t_obj_1 >,
std::list< t_obj_2 > usw.

Instanzen dieser Templates möchte ich bearbeiten, z.B. für eine
Ausgabefunktion void Ausgeben(const t_obj_list& rListe);

Und hier hänge ich - die Ausgabe soll über die Basisklasse laufen, also
z.B. t_obj->Name();, ich sehe aber keine Möglichkeit, wie ich eine
Basisklasse der Container übergeben kann.

Ich habe schon versucht, das Template mit einem Interface zu erstellen,
das Zeiger auf die Basisklasse liefert, aber dabei kann ich keine
Iteratoren definieren. Sieht etwa so aus (mit "Pseudocode" wie template:Smile:

std::list< c_obj >::const_iterator m_It;

void template::Start() { m_It= m_Liste.begin() }

t_obj* template::Next()
{ if (m_It!= m_Liste.end()) return *m_It++; else return 0; }

und das Problem besteht darin, dass m_It nicht "funktioniert" (keine
Zuweisung möglich, ++ nicht definiert, etc.). Das erscheint mir auch
logisch, da es der Instanz eines Templates entsprechen würde und
natürlich erst als Member definiert werden kann, wenn das Template einen
konkreten Typ hat.

Hier stehe ich nun auf dem Schlauch - sieht jemand eine elegante
Möglichkeit, wie ich auf die Container zugreifen kann, ohne mir für
jeden Container eine spezielle Funktion zu schreiben? Oder gibt es da
komplett andere Ansätze?

Gruß,

Ed

--
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
Hendrik Belitz
Guest





PostPosted: Thu Jun 17, 2004 11:09 am    Post subject: Re: Template und Klassenhierarchie Reply with quote



Edzard Egberts wrote:

Quote:
Hier stehe ich nun auf dem Schlauch - sieht jemand eine elegante
Möglichkeit, wie ich auf die Container zugreifen kann, ohne mir für
jeden Container eine spezielle Funktion zu schreiben? Oder gibt es da
komplett andere Ansätze?

Gruß,

Ed


Warum speicherst Du in der Liste nicht einfach (Smart-)Pointer auf die
Objekte ab? Dann erledigt sich das Problem von selbst.

--
To get my real email adress, remove the two onkas
--
Hendrik Belitz
- Abort, Retry, Fthagn? -

--
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
Rolf Magnus
Guest





PostPosted: Thu Jun 17, 2004 11:48 am    Post subject: Re: Template und Klassenhierarchie Reply with quote



Edzard Egberts wrote:

Quote:
Hallo,

gegeben ist eine Klassenhierarchie mit t_obj als Basis (abstrakt
virtuell) und Ableitungen, wie t_obj_1, t_obj_2, usw.

Über die Namensgebung solltest du nochmal nachdenken ;-)

Quote:
Diese werden in Templates gespeichert, wie z.B. std::list< t_obj_1 >,
std::list< t_obj_2 > usw.

Instanzen dieser Templates möchte ich bearbeiten, z.B. für eine
Ausgabefunktion void Ausgeben(const t_obj_list& rListe);

Und hier hänge ich - die Ausgabe soll über die Basisklasse laufen,

Warum?

Quote:
also z.B. t_obj->Name();, ich sehe aber keine Möglichkeit, wie ich
eine Basisklasse der Container übergeben kann.

Ich habe schon versucht, das Template mit einem Interface zu
erstellen, das Zeiger auf die Basisklasse liefert, aber dabei kann ich
keine Iteratoren definieren. Sieht etwa so aus (mit "Pseudocode" wie
template:Smile:

Das ist irritierend, da template ein Schlüsselwort ist.

Quote:
std::list< c_obj >::const_iterator m_It;

void template::Start() { m_It= m_Liste.begin() }

t_obj* template::Next()
{ if (m_It!= m_Liste.end()) return *m_It++; else return 0; }

und das Problem besteht darin, dass m_It nicht "funktioniert" (keine
Zuweisung möglich, ++ nicht definiert, etc.).

Das liegt daran, daß eine std::list<c_obj> in keiner Weise mit einer
std::list<t_obj_1> verwandt ist, auch dann nich, wenn t_obj_1 von c_obj
abgeleitet ist, und das gilt dann natürlich auch für deren Iteratoren.

Quote:
Das erscheint mir auch logisch, da es der Instanz eines Templates
entsprechen würde und natürlich erst als Member definiert werden kann,
wenn das Template einen konkreten Typ hat.

Hier stehe ich nun auf dem Schlauch - sieht jemand eine elegante
Möglichkeit, wie ich auf die Container zugreifen kann, ohne mir für
jeden Container eine spezielle Funktion zu schreiben? Oder gibt es da
komplett andere Ansätze?

Entweder schreibst du ein Template, das das macht (warum du oben
unbedingt über einen Zeiger auf die Basisklasse die Memberfunktion
aufrufen willst anstatt direkt, ist mir nicht klar), oder du machst nur
eine einzige Liste, in die du Zeiger auf die Basisklasse steckst. Die
können dann auf Instanzen beliebiger davon abgeleiteter Klassen zeigen.
Die Memberfunkitonen, deren Implementationen in den abgeleiteten
Klassen unterschiedlich sind, müssen dann halt virtuell sein.

--
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
Markus Schaaf
Guest





PostPosted: Thu Jun 17, 2004 2:45 pm    Post subject: Re: Template und Klassenhierarchie Reply with quote

"Edzard Egberts" <Ed_03 (AT) t-online (DOT) de> schrieb:

Quote:
gegeben ist eine Klassenhierarchie mit t_obj als Basis (abstrakt
virtuell) und Ableitungen, wie t_obj_1, t_obj_2, usw.
Diese werden in Templates gespeichert, wie z.B. std::list< t_obj_1 >,
std::list< t_obj_2 > usw.
Instanzen dieser Templates möchte ich bearbeiten, z.B. für eine
Ausgabefunktion void Ausgeben(const t_obj_list& rListe);

Und hier hänge ich - die Ausgabe soll über die Basisklasse laufen, also
z.B. t_obj->Name();, ich sehe aber keine Möglichkeit, wie ich eine
Basisklasse der Container übergeben kann.

Ich verstehe das Problem wahrscheinlich nicht ganz, aber prinzipiell
funktioniert das schon:

#include <vector>
#include <iostream>
#include <ostream>
#include <algorithm>

struct Base {
virtual char const * Name() const = 0;
};

struct Derived : Base {
char const * Name() const { return "Derived"; }
};

void PrintName( Base const & o ) {
std::cout << o.Name() << 'n';
}

int main() {
std::vector< Derived > vD( 3 );
std::for_each( vD.begin(), vD.end(), &PrintName );
}

MfG

--
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
Edzard Egberts
Guest





PostPosted: Thu Jun 17, 2004 3:19 pm    Post subject: Re: Template und Klassenhierarchie Reply with quote

Hallo Rolf,

Quote:
Über die Namensgebung solltest du nochmal nachdenken Wink

*g* die werden von mir auch wirklich nicht so verwendet.

Quote:
Und hier hänge ich - die Ausgabe soll über die Basisklasse laufen,
Warum?

Ich bastele mit Softwarekomponenten:

Für jedes Objekt meiner Hierarchie existiert ein "Objekteditor" (der zu
einer Editorhierarchie gehört) zur Bearbeitung des Objektes. Dieser
Objekteditor kann alleine stehen, aber auch über ein Interface mit einem
"Listeneditor" verbunden sein. Der Listeneditor enthält einen Vector mit
Zeigern auf die Basisklasse und übergibt bei Listenoperationen wie neues
Objekt auswählen den Zeiger auf das entsprechende Objekt an den Editor.

Wenn ich also eine Liste (oder einen anderen Container) mit Objekten der
Hierarchie bearbeiten will, rufe ich den Listeneditor mit dem
entsprechenden Objekteditor auf und übergebe die Zeiger auf die Objekte.

Dafür muss ich immer eine bekannte Instanz bearbeiten, z.B.

typedef std::list< t_obj > t_obj_list;
t_obj_list Liste;

t_obj_list::const_iterator it;
Listeneditor.resize(Liste.size());
for (unsigned i= 0; i< Liste.size(); ++i)
{
Listeneditor.Set(i, &(*it));
++it;
}

Das ist Code, den ich dauernd kopieren muss und wenn man dauernd Code
kopiert, hat man C++ nicht verstanden...

Was ich gerne hätte ist "Listeneditor(Liste);" für jede Liste die
Objekte der Objekthierarchie enthält.

Aber ich finde einfach nicht heraus, wie ich den Code ohne die
Typinformation der Liste in den Listeneditor reinkriege. Mein Versuch
bestand darin, statt std::list ein template mit einem Interface zu
verwenden, wobei das template selber wieder std::list enthält. Über das
Iterface bekomme ich die Objekte aber nicht der Reihe nach abgefragt,
weil ich den Iterator als Member definieren müsste, was nicht geht.

Quote:
Das liegt daran, daß eine std::list std::list<t_obj_1> verwandt ist, auch dann nich, wenn t_obj_1 von c_obj
abgeleitet ist, und das gilt dann natürlich auch für deren Iteratoren.

Aha, so gut konnte ich das für mich nicht formulieren. Deine
Lösungsvorschläge scheinen mir aber nicht genau zum Problem zu passen.
Aber da fehlte ja noch Hintergrundinformation.

Gruß,

Ed

--
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
Edzard Egberts
Guest





PostPosted: Thu Jun 17, 2004 3:19 pm    Post subject: Re: Template und Klassenhierarchie Reply with quote

Hallo Hendrik,

Quote:
Warum speicherst Du in der Liste nicht einfach (Smart-)Pointer auf die
Objekte ab? Dann erledigt sich das Problem von selbst.

weil es eigentlich nicht nötig ist und ich dazu neige, Overhead zu
verweiden, wenn der nicht zur Lösung des Problems beiträgt. Für mein
Ziel der Datenspeicherung reicht mir ein Container, der die Objekte
direkt enthält. Mein Ziel des Zugriffes möchte ich ohne Veränderung der
Datenstrukturen erreichen.

Gruß,

Ed

--
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
Markus Schaaf
Guest





PostPosted: Thu Jun 17, 2004 3:30 pm    Post subject: Re: Template und Klassenhierarchie Reply with quote

"Edzard Egberts" <Ed_03 (AT) t-online (DOT) de> schrieb:

Quote:
typedef std::list< t_obj > t_obj_list;
t_obj_list Liste;

t_obj_list::const_iterator it;
Listeneditor.resize(Liste.size());
for (unsigned i= 0; i< Liste.size(); ++i)
{
Listeneditor.Set(i, &(*it));
++it;
}

Davon abgesehen, daß der Code nicht funktioniert: Was hindert Dich
daran, daraus eine Template-Funktion zu machen?

--
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
Edzard Egberts
Guest





PostPosted: Thu Jun 17, 2004 4:30 pm    Post subject: Re: Template und Klassenhierarchie Reply with quote

Hallo Markus,

Quote:
typedef std::list< t_obj > t_obj_list;
t_obj_list Liste;

t_obj_list::const_iterator it;
Listeneditor.resize(Liste.size());
for (unsigned i= 0; i< Liste.size(); ++i)
{
Listeneditor.Set(i, &(*it));
++it;
}
Davon abgesehen, daß der Code nicht funktioniert

mp_Dialog= new dlg_liste(this);
mp_Dialog->resize(m_Tarife.size());
dt_tarif_liste::const_iterator it= m_Tarife.begin();
for (unsigned i= 0; i< mp_Dialog->size(); ++i)
{
mp_Dialog->Set(i, &(*it));
++it;
}

Ich finde aber keinen relevanten Unterschied zum Originalcode.

Quote:
Was hindert Dich
daran, daraus eine Template-Funktion zu machen?

*Hüstel* - das Brett vorm Kopf:

template < class T > void Fill(dlg_liste& Dlg, std::list< T > Liste)
{
Dlg.resize(Liste.size());
std::list< T >::const_iterator it= Liste.begin();
for (unsigned i= 0; i< Dlg.size(); ++i)
{
Dlg.Set(i, &(*it));
++it;
}
}

Gruß,

Ed

--
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.