PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ STL list


Godmode
2006-03-20, 23:24:47
Und zwar:

Ich habe ein kleines Framework mit folgender Ableitungshierarchie:

Object
|_>Collection
|_>String
|_>Integer

Collection
|_>Vector
|_>List

Diese List soll jetzt so implementiert werden, das man als Datenkomponente eine Variable l vom Typ STL::list<Object*> verwendet, welche eben die Liste repräsentiert. Die Klasse List ist also eigentlich nur eine Verpackung für die STL::List, damit man eben schön damit im kleinen Framework arbeiten kann.

jetzt ein kleines Anwendungsbeispiel:

bool List::Contains(Object *o) const
{
return o == *find(l.begin(), l.end(), o);
} // List::Contains
......
.....
....
int main(.................
{
List l;
String *s1 = new ML::String("abc");
String *s2 = new ML::String("xyz");
l.Add(s1);
l.Add(s2);
cout << l.Contains(new ML::String("xyz"));
......
}

contains gibt jetzt immer false zurück, logisch, da ja nur Pointer verglichen werden. Wie löse ich das ganze nun am besten, vielleicht ShardedPointer(SmartPointer)?

Coda
2006-03-20, 23:27:37
Äh. Gar nicht... Ohne RTTI kommst du da nicht weiter und ich verstehe den Sinn und Zweck der ganzen Geschichte nicht. Warum zur Hölle sollte man einen Integer in eine Klasse kapseln?

Und es ist std::list nicht STL::list.

Was ich vor allem kritisieren will ist dass du dir hier dein eigenes verschlimmbessertes Framework versuchst zu basteln obwohl es dieses in C++ standarisiert und durchdacht schon gibt. Glaub mir, es ist keine gute Idee.

Godmode
2006-03-20, 23:35:04
Äh. Gar nicht... Ohne RTTI kommst du da nicht weiter und ich verstehe den Sinn und Zweck der ganzen Geschichte nicht. Warum zur Hölle sollte man einen Integer in eine Klasse kapseln?

Und es ist std::list nicht STL::list.

Was ich vor allem kritisieren will ist dass du dir hier dein eigenes verschlimmbessertes Framework versuchst zu basteln obwohl es dieses in C++ standarisiert und durchdacht schon gibt. Glaub mir, es ist keine gute Idee.

Hätte vielleicht dazuschreiben sollen, das es ein Beispiel von der Schule ist. Wir sollen dabei einfach den Umgang mit der STL lernen. und STL::list hab ich nur geschrieben, damit ihr seht, dass die list Klasse der STL gemeint ist und nicht irgend eine andere List.

Coda
2006-03-20, 23:37:21
Erschieß den Lehrer! Bitte!!!!

Godmode
2006-03-20, 23:40:34
Erschieß den Lehrer! Bitte!!!!

Kann ich nicht machen, dann habe ich ja niemanden mehr, der die interessante Vorlesung hält. :biggrin:

Das Framework haben wir am Anfang verwendet, um den Leuten, die noch nie mit nem Framework gearbeitet haben, zu zeigen, wie man so etwas verwendet.

Jetzt haben wir ne Zeit lang mit der STL gearbeitet und diese abschließende Übung, sollte alles nochmal etwas festigen.

Coda
2006-03-20, 23:41:48
Ich weiß nicht wie so ein Müll didaktisch wertvoll sein soll. Aber Hochschulen halt (ja ich studier auch) ...

Godmode
2006-03-20, 23:44:46
Zum Glück fangen wir diese Woche mit Java an, freue mich schon richtig darauf! C++, ja alles schön und gut, aber doch nicht solchen B...S...!

Coda
2006-03-20, 23:46:42
Wahrscheinlich ist eben genau das die Ursache für solchen Müll :biggrin:

Zu deinem Problem: Du must wie gesagt mit RTTI kompilieren und dann nur die Objekte in der Liste die mit dem an Compare übergebenen Typen übereinstimmen vergleichen (vorher dynamic_cast natürlich). Eine andere Möglichkeit sehe ich nicht, außer du implementierst dein eigenes RTTI (noch böser).

Godmode
2006-03-20, 23:52:39
Wahrscheinlich ist eben genau das die Ursache für solchen Müll :biggrin:

Zu deinem Problem: Du must wie gesagt mit RTTI kompilieren und dann nur die Objekte in der Liste die mit dem an Compare übergebenen Typen übereinstimmen vergleichen (vorher dynamic_cast natürlich). Eine andere Möglichkeit sehe ich nicht, außer du implementierst dein eigenes RTTI (noch böser).

Hehe, ja in dem SuperFramework ist sogar eigenes RTTI drinnen ;D. Naja danke mal, ich werde schauen was sich machen lässt.

Coda
2006-03-20, 23:54:00
Hehe, ja in dem SuperFramework ist sogar eigenes RTTI drinnen ;D.http://www.forum-3dcenter.org/vbulletin/showpost.php?p=4105578&postcount=4

Unfassbar.

DocEW
2006-03-21, 00:51:20
Nicht jede Übung muß in einer sinnvollen Anwendung münden, oder?
Ich wette in der Grundschule hast du auch erstmal Reihen voll mit immer dem gleichen Buchstaben geschrieben... ;)

Coda
2006-03-21, 01:03:03
Nicht jede Übung muß in einer sinnvollen Anwendung münden, oder?Doch, aber es ist ungefähr so als wenn man Griechisch unterrichtet würde um die Studenten auf England vorzubereiten was der da macht. Völliger Bullshit.

Er implementiert sich Features die in der Sprache schon gegeben sind neu. Ich weiß schon was da später für Code rauskommt bei den Leuten...

Chris Lux
2006-03-21, 08:44:17
bool List::Contains(Object *o) const
{
return o == *find(l.begin(), l.end(), o);
} // List::Contains
......
}

contains gibt jetzt immer false zurück, logisch, da ja nur Pointer verglichen werden. Wie löse ich das ganze nun am besten, vielleicht ShardedPointer(SmartPointer)?
ok. richtig (egal ob es sinnvoll ist) wäre folgendes:

bool List::Contains(Object *o) const
{
return (find(l.begin(), l.end(), o) != l.end());
} // List::Contains

aber das löst nicht dein string compare problem. wollte es nur anmerken.

Godmode
2006-03-21, 18:30:26
Hab das Problem jetzt mit einem Funktionsobjekt gelöst:


class MLObjEq {
private:
Object *o1;
public:
MLObjEq(Object* o1) : o1(o1) {
} // MLObjEq::MLObjEq
bool operator() (Object* o2) {
return o1->IsEqualTo(o2);
} // MLObjEq::operator()
}; // MLObjEq

bool List::Contains(Object *o) const {
return (find_if(l.begin(), l.end(), MLObjEq(o)) != l.end());
} // List::Contains