[closed] STL und Funktionsdeklaration

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
PoetikBiker
Beiträge: 41
Registriert: 2. Mai 2012 13:43

[closed] STL und Funktionsdeklaration

Beitrag von PoetikBiker »

Hallo zusammen,

ich habe folgendes Problem: :shock:

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 :D
Zuletzt geändert von PoetikBiker am 5. Juni 2012 15:44, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: STL und Funktionsdeklaration

Beitrag 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);
}
PoetikBiker
Beiträge: 41
Registriert: 2. Mai 2012 13:43

Re: STL und Funktionsdeklaration

Beitrag 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:

Code: Alles auswählen

iterator  erase(iterator __position);
Schlau wie ich bin schreibe ich die Methode: :D

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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: STL und Funktionsdeklaration

Beitrag 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.
PoetikBiker
Beiträge: 41
Registriert: 2. Mai 2012 13:43

Re: STL und Funktionsdeklaration

Beitrag 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... :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: STL und Funktionsdeklaration

Beitrag 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, ...).
PoetikBiker
Beiträge: 41
Registriert: 2. Mai 2012 13:43

Re: STL und Funktionsdeklaration

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: STL und Funktionsdeklaration

Beitrag 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.
PoetikBiker
Beiträge: 41
Registriert: 2. Mai 2012 13:43

Re: STL und Funktionsdeklaration

Beitrag von PoetikBiker »

franzf hat geschrieben: "iterator" durch "Iter" ersetzen
So hatte ich es bereits vor Deiner Antwort gemacht :wink:

Aber ich danke Dir! Die STL braucht eben doch ein wenig Einarbeitungszeit!
Aber Templates finde ich zunehmend geiler... hust.... wollte sagen interessanter :oops:
Antworten