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 friend
wird 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 dieservector
machen für jede Instanz.Schreiben einer
static
Member-Funktion, die einestatic
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.
, 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. –
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. –
@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. –