Also habe ich überall gesucht und ich kann nicht scheinen, die Antwort zu dieser spezifischen Frage zu finden. Ich benutze ein winXP mit Cygwin und gcc 3.4.4 cygming special.Inherited-Klasse, die eine benutzerdefinierte Klasse unter Verwendung eines Nicht-Standardkonstruktors initialisiert
Problem: Ich habe eine Klasse, die als Schnittstelle mit einigen abstrakten Methoden und geschützten Variablen funktioniert, die in jeder Klasse sein sollten, die von dieser Klasse erbt. Jetzt habe ich auch eine andere Klasse, die eine Mitgliedsvariable dieser Schnittstelle ist.
class Bar {
private:
int y;
public:
Bar(int why);
};
Bar::Bar(int why) : y(why) {}
class Foo {
protected:
Bar b;
public:
Foo(int x);
virtual void print_base();
};
Foo::Foo(int x) : b(x+3) // Have to use initializer list here.
{
//this->b(x+3); // doesn't work
}
class DerFoo : public Foo {
protected:
Bar db;
public:
DerFoo(int x);
};
DerFoo::DerFoo(int x) : Foo(x),
db(x+3) // (Bar)(int) being called, works fine
// db(4.0, 30) // no matching function for call to Bar::Bar(double, int)
// note: candidates are Bar::Bar(const Bar&), Bar::Bar(int)
// b(x-3) // doesn't work class DerFoo does not have any field named 'b'
{
//this->b(x - 3); // Doesn't work, error no match for call to (Bar)(int)
//this->db(x + 3); // Doesn't work, error no match for call to (Bar)(int)
}
So ist das Problem, wie Sie ist innerhalb der abgeleiteten Klasse foo sehen können, DerFoo wie b zu initialisieren. Ich habe versucht, Mitglied Initialisierung Methode, aber dann erkennt der Compiler nicht über geschützte Variablen. Aus irgendeinem mir unbekannten Grund kann der Konstruktor in dieser Klasse nicht gefunden werden. Auch wenn ein "falscher" Aufruf an den Konstruktor einer geschützten Membervariable (nicht geerbt) eingeschlossen wäre, würde dies die korrekte Version des Konstruktors vorschlagen.
Ich habe noch keine Ahnung, wie das geht. Jede Hilfe wird sehr geschätzt.
Ich bin verwirrt - mit ein paar kleineren Verbesserungen dieses kompiliert gut auf ideone (http://ideone.com/2cLUa). Welchen Fehler bekommst du und wo? – tmpearce
Ok, ich denke ich sehe wo du verwirrt wirst. In dem von Ihnen geposteten Code wird die 'Foo :: b'-Membervariable ** ** initialisiert, wenn Sie' Foo (x) 'aufrufen. Sie können dem Konstruktor "Bar" eine Debug-Nachricht hinzufügen, und Sie werden sehen, dass sie zweimal initialisiert wird - einmal für "b" und einmal für "db". Sobald "b" initialisiert ist, können Sie nicht neu initialisieren, Sie müssen ihm einen neuen Wert zuweisen, indem Sie '=' (Zuweisungsoperator) verwenden. – tmpearce
Rechts. Vielen Dank für Ihre Antworten, sehr aufschlussreich und hilfreich. Da einige meinen, dies sei "sehr ineffizient", hat mein realer Code viele Variablen auf der Schnittstellenebene. Das könnte ein schlechtes Design von mir sein, aber ich denke nicht, dass es für dieses Projekt wichtig ist. Deshalb denke ich, dass ich mit dieser Wahl gehen, 'Foo (int b, int c, double d) ...' für alle meine Membervariablen und dann tun 'DerFoo (int dera, Derx): Foo (b, c, d) {... ' – tomasgudm