Ich schlage die Verwendung eines private friend
Methode, die die Anwendungslogik des Konstruktors implementiert und die von den verschiedenen Konstruktoren aufgerufen wird. Hier ist ein Beispiel:
Angenommen, wir haben eine Klasse namens StreamArrayReader
mit einigen privaten Feldern:
private:
istream * in;
// More private fields
Und wir wollen die beiden Konstruktoren definieren:
public:
StreamArrayReader(istream * in_stream);
StreamArrayReader(char * filepath);
// More constructors...
Die zweite macht einfach von der ersten Gebrauch (und natürlich wollen wir die Implementierung der ersten nicht duplizieren). Idealerweise würde man gerne so etwas tun wie:
StreamArrayReader::StreamArrayReader(istream * in_stream){
// Implementation
}
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
StreamArrayReader(&instream);
instream.close();
}
Dies ist jedoch in C++ nicht zulässig. Aus diesem Grund können wir eine private freundliche Methode wie folgt definieren, die das implementiert, was der erste Konstruktor tun soll:
private:
friend void init_stream_array_reader(StreamArrayReader *o, istream * is);
Jetzt hat diese Methode (weil sie ein Freund ist) Zugriff auf die privaten Felder von o
. Dann wird der erste Konstruktor:
StreamArrayReader::StreamArrayReader(istream * is) {
init_stream_array_reader(this, is);
}
Beachten Sie, dass dadurch keine Mehrfachkopien für die neu erstellten Kopien erstellt werden. Die zweite wird:
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
init_stream_array_reader(this, &instream);
instream.close();
}
Das heißt, Anstatt dass ein Konstruktor einen anderen aufruft, rufen beide einen privaten Freund auf!