0

Hier ist das Problem: eine Klasse namens Factory hat mehrere nicht-statische Member-Funktionen der gleichen Signatur, nennen wir sie f1, f2 und so weiter. Ich würde gerne Zeiger auf diese Member-Funktionen in einem std::vector setzen, das ist ein static const, da es nicht notwendig ist, dass jemals in Laufzeit ändern. Aus Gründen der Eleganz möchte ich auch nicht f1 und die anderen (summarisch fi unten) und nicht die vector entweder aussetzen, aber das ist zweitrangig. Wie kann ich ein statisches Const-Klassenmitgliedsobjekt initialisieren, das sich auf private Felder bezieht?

Initialisieren der vector in Klasse wird nicht arbeiten, weil es ein unvollständiger Typ ist, und &Factory::fi sind zu diesem Zeitpunkt nicht bekannt. Initialisieren Sie es außerhalb auf Dateiebene wird nicht funktionieren, weil fi sind privat und ich kann nicht mit dem globalen Bereich befreunden. Putting das in einer Initialisierungsfunktion und damit ein friendwird nicht funktionieren, weil das eine const umschreiben müsste.

Was funktioniert, ist:

  • die static const-Qualifikation zu entfernen, auf Kosten der eine unnötige Kopie dieser vector machen für jede Instanz.

  • Schreiben einer static Member-Funktion, die eine static Variable deklariert und zurückgibt. Ich dachte, das wäre genauso gut, aber es lässt mein Programm mit allen Optimierungen doppelt so langsam laufen.

Sicher möchte ich eine Lösung ohne die letztgenannten Nachteile sehen. Bitte rate mir nicht, die Funktionen von switch oder ähnlichen großen Änderungen des Paradigmas aufzurufen.

Antwort

1

Haben Sie daran gedacht? Es war nicht ganz klar aus der Problemstellung.

#include <vector> 

class Factory { 
private: 
    void f1() {} 
    void f2() {} 
public: 
    typedef void (Factory::*PF)(); 
    static const std::vector<PF> v; 
}; 

const std::vector<Factory::PF> Factory::v{&Factory::f1, &Factory::f2}; 


int main() 
{ 
    Factory f; 
    (f.*Factory::v[0])(); 
} 

Demo

+0

, dass einer der Ansätze ist, dass ich versuchte und habe nicht funktioniert (zweiten Fall in zweitem Absatz der q). Es heißt "Fehler: [Signatur ...] Factory :: f1() ist in diesem Kontext privat". Nun, es ist nicht in Ihrem * Beispiel. Ich muss herausfinden, wie sich das wesentlich von meinem derzeitigen Code unterscheidet. –

+0

Und tut mir leid, dass ich nicht klar bin, obwohl ich nicht weiß, wo. Ihr Code ist genau das Szenario, das ich mir vorstelle. Seltsamerweise funktioniert das alleine (und ist in der Tat eine der Methoden, die ich zuerst ausprobiert habe), erzeugt aber den obigen Fehler, wenn ich in meinem größeren Projekt bin. –

+0

@TheVee Wenn Sie weitere Hilfe benötigen, zeigen Sie [MCVE] (http://stackoverflow.com/help/mcve) an, die den Fehler reproduziert. Ich kann nicht mit Code helfen, den ich nicht sehen kann. –

Verwandte Themen