 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Edzard Egberts Guest
|
Posted: Thu Jun 17, 2004 11:04 am Post subject: Template und Klassenhierarchie |
|
|
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: :
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
|
Posted: Thu Jun 17, 2004 11:09 am Post subject: Re: Template und Klassenhierarchie |
|
|
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
|
Posted: Thu Jun 17, 2004 11:48 am Post subject: Re: Template und Klassenhierarchie |
|
|
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: :
|
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
|
Posted: Thu Jun 17, 2004 2:45 pm Post subject: Re: Template und Klassenhierarchie |
|
|
"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
|
Posted: Thu Jun 17, 2004 3:19 pm Post subject: Re: Template und Klassenhierarchie |
|
|
Hallo Rolf,
| Quote: | Über die Namensgebung solltest du nochmal nachdenken
|
*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
|
Posted: Thu Jun 17, 2004 3:19 pm Post subject: Re: Template und Klassenhierarchie |
|
|
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
|
Posted: Thu Jun 17, 2004 3:30 pm Post subject: Re: Template und Klassenhierarchie |
|
|
"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
|
Posted: Thu Jun 17, 2004 4:30 pm Post subject: Re: Template und Klassenhierarchie |
|
|
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 |
|
 |
|
|
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
|
|