Seite 1 von 1
[closed] STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 10:11
von PoetikBiker
Hallo zusammen,
ich habe folgendes Problem:
Gemäß vorheriger Threads hier habe ich ein Listenklasse erstellt:
Code: Alles auswählen
template <class T>
class qListI : public RefObj
{
public:
typedef typename std::list<T>::iterator Iter;
private:
std::list<T> m_lst;
public:
qListI();
virtual ~qListI();
Iter Begin() { return m_lst.begin(); }
Iter End() { return m_lst.end(); }
....
}; // class qListI
Jetzt möchte ich ein sort-Funktion implementieren:
Code: Alles auswählen
void Sort(WasMussHierStehen? _pFunction)
{
m_lst.sort(_pFunction);
}
Wie bitte sieht die Deklaration für "WasMussHierStehen?" aus. (Bin halt immer noch Anfänger, und die STL ist schon komplex...)
Der sort-Aufruf auf eine STL-Liste funktioniert soweit prima, aber da diese jetzt in der Klasse gekapselt ist, muß ich die Sortierfunktion ja an eine entsprechende Member-Funktion der kapselnden Klasse übergeben - und das kriege ich nicht hin....
Die Sortierfunktion sieht übrigens folgendermaßen aus:
Code: Alles auswählen
bool SortOptions4Prices(const RefPtr<Option> &_lhs,
const RefPtr<Option> &_rhs)
{
return _lhs->GetPrice() > _rhs->GetPrice();
} // SortOptions4Prices
aber das ist hier jetzt nicht das Problem und nicht wirklich von Belang!
Vielen Dank für eure Hilfe

Re: STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 10:53
von franzf
Machs doch wie std::list::sort: template-Parameter. So kann der Benutzer eine freie Funktion, eine std::function-Instanz (oder einen beliebigen äquvalenten Funktionspointer-Wrapper) oder einen eigenen Funktor übergeben.
Code: Alles auswählen
template <typename Functor_>
void Sort(Functor_ fun) {
m_lst.sort(fun);
}
Re: STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 11:57
von PoetikBiker
Code: Alles auswählen
template <typename Functor_>
void Sort(Functor_ fun) {
m_lst.sort(fun);
}
Klappt prima, danke sehr.
Doch die Probleme reißen nicht ab. Jetzt benötige ich noch die erase() Methode.
Die Deklaration für für erase in "stl_list.h" lautet:
Schlau wie ich bin schreibe ich die Methode:
Code: Alles auswählen
template <class T>
class qListI : public RefObj
{
...
private:
std::list<T> m_lst;
...
void Erase(iterator _position)
{
m_lst.erase(position);
}
...
Zu früh gefreut
Der Compiler sagt:
..\qBase\Src\/../../qBase/Src/qListI.h:55:18: error: 'iterator' has not been declared
Wie bitte muß die Deklartion für eine allgemeine Erase()-Methode lauten?
Re: STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 12:26
von franzf
Welche Methoden willst du denn noch in deine Klasse einführen? Nicht am Ende die gesamte std::list-API?
Vielleicht kannst du ja kurz erklären, was der Grund für die Entscheidung ist, alles in eine Klasse zu packen, und was diese kann was mit STL-Einzeilern nicht auch geht. Evtl. kommen wir mit einem anderen Design (nicht ableiten

) schneller ans Ziel.
Re: STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 13:05
von PoetikBiker
Ich zietiere aus einem anderen Thread:
http://qtforum.de/forum/viewtopic.php?f=14&t=14844
franzf hat geschrieben:Generell (und das solltest du beherzigen) sind die STL-Container nicht zum ABleiten gedacht. Alleine das Fehlen eines virtuellen Destruktors ist ein K.O.-Kriterium.
Es ist so, das die STL per Vorgabe gewrappt werden muß. Darüber kann man streiten, aber der Arbeitgeber verlangt dies (aus einsehbaren Gründen). Hinzu kommt, das es einige sehr spezielle Methoden auf diese Liste gibt. Und es sind vielleicht 10 Methoden, die "Überschrieben" werden müssen, erase() wäre so ziemlich die letzte...
Aber ich bin für andere Design-Vorschläge sehr offen...

Re: STL und Funktionsdeklaration
Verfasst: 4. Juni 2012 16:50
von franzf
PoetikBiker hat geschrieben:Es ist so, das die STL per Vorgabe gewrappt werden muß.
Wie jetzt? Warum dann erst der Versuch mit Ableitung?
Und den Thread kannte ich natürlich, leider wird daraus nicht ersichtlich, was du (im großen) vor hast.
Kannst du mal genau sagen, was erwartet wird? Mich würde (neben den 10 Funktionen, die aus std::list übernommen werden sollen) interessieren, wie viele neue Funktionen dazu kommen (Name, was sie tun, ...).
Re: STL und Funktionsdeklaration
Verfasst: 5. Juni 2012 14:46
von PoetikBiker
Also Franz,
es geht darum, ein bestehendes 3D-Projekt in der Performance zu steigern.
Ein zentraler Punkt ist ein große Liste, in der grafische Elemente verwaltet werden. Diese Liste wurde von einem nicht mehr hier arbeitenden Ex-Kollegen programmiert, und zwar saumäßig. Es gibt nur eine überschaubare Anzahl von "Standard-Funktionen", wie AddItem (=> push_back()), DeleteItem (=> erase()) etc.
Es gibt allerdings mehrere Threads, die im Hintergrund diese Liste bearbeiten, Elemente zusammenfassen, neu sortieren, Elemente in mehrer neue splitten, Elemente modifizieren und so weiter, immer auch abhängig von den User-Aktivitäten.
Da diese Liste eben saumäßig programmiert wurde, ist sie saulangsam. Daher will ich die jetzt durch eine STL-Liste ersetzen. Wie Du Dir vorstellen kannst, ist ein solches Multithreading-Program durchaus komplex, daher soll und darf die Schnittstelle zu dieser Liste nicht verändert werden. Wie die Liste intern arbeitet ist egal, Hauptsache sie macht das gleiche wie zuvor - nur eben sehr viel schneller!
Zur Ehrenrettung des Kollegen sei gesagt, das die bestehende Liste im Prinzip aus der vor-C++ Ära stammt und in C geschrieben wurde, der später dann in eine Klasse gepresst wurde. (allerdings ist sie selbst für C-Code saumäßig).
Beantwortet das Deine Frage?
Re: STL und Funktionsdeklaration
Verfasst: 5. Juni 2012 15:11
von franzf
PoetikBiker hat geschrieben:Beantwortet das Deine Frage?
Ja. Kapseln sollte die beste Lösung sein.
Der Compiler sagt:
..\qBase\Src\/../../qBase/Src/qListI.h:55:18: error: 'iterator' has not been declared
Weil "iterator" einfach da nicht existiert - das ist eine Innere Klasse innerhalb von std::list. Du hast ja schon deinen typedef auf Iter, also "iterator" durch "Iter" ersetzen. Oder direkt "std::list<T>::iterator" nehmen.
Re: STL und Funktionsdeklaration
Verfasst: 5. Juni 2012 15:43
von PoetikBiker
franzf hat geschrieben:
"iterator" durch "Iter" ersetzen
So hatte ich es bereits vor Deiner Antwort gemacht
Aber ich danke Dir! Die STL braucht eben doch ein wenig Einarbeitungszeit!
Aber Templates finde ich zunehmend geiler... hust.... wollte sagen interessanter
