überschreiben Konstruktor c++
Habe ich abstrakte Klasse Eine
class A{
public:
A(dim) : dim_(dim);
private:
int dim_;
}
Klasse B
class B : public A{
public:
B(int dim);
}
und ich brauche, um Konstruktor für die Klasse B, die nur funktioniert, wenn dim > 1, und werfen Behauptungen sonst.
in diesem Fall
B::B(int dim) : A(dim){
assert(dim > 1);
}
es funktioniert, aber es ist keine gute Lösung denke ich, da die Instanz der Klasse A wurde angelegt und gelöscht werden.
Als ich die init-Methode für die Klasse A:
class A{
public:
void init(int dim){
dim_ = dim;
}
A(int dim){
init(dim);
}
private:
int dim_;
}
und ändern Konstruktor der Klasse B:
class B : public A {
public:
B(int dim){
assert(dim > 1);
init(dim);
}
}
aber es funktioniert nicht. Gibt es mögliche Lösungen für mein problem?
Klasse
irgendwie habe ich das Gefühl, dass sich auf 'dim' in deinem Tor ist der falsche Ansatz.
A
ist nicht abstract...irgendwie habe ich das Gefühl, dass sich auf 'dim' in deinem Tor ist der falsche Ansatz.
InformationsquelleAutor user1761982 | 2013-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie könnten schreiben Sie eine kleine
myint
Klasse, die dafür sorgt, dass dieint
passieren Sie ist immer größer als1
:Benutzen es jetzt in Ihrer Klasse:
Beachten Sie, dass Sie noch konstruieren
B
vorbeiint
werden, denn es wird implizit konvertieren inmyint
und während die Umwandlung stattfindet (implizit), es wird die Prüfung des behaupten, und wenn das gelingt, nur dann würden Sie in der Lage sein, um passdim.data
an der Basis-KlasseA
. Wenn die behaupten fehl, das Programm abzubrechen, bevor Sie in der Basisklasse Konstruktor (ohne initialisieren alles, was in der abgeleiteten Klasse auch).Könnte man auch verallgemeinern:
Benutzen es jetzt in Ihrer Klasse:
Benötigen Sie eine andere Klasse, zum Beispiel:
Cool, nicht?
explicit
und ich glaube, es ist für einen guten Grund. Trotzdem glaube ich nicht, dass die Lösung des Problems ist ganz cool.Ja, Sie haben vielleicht gute Gründe. Aber es ist nicht immer gut.
std::string
hat non-explicit einziges argument-Konstruktor, und ich denke, es ist nicht explizit für einen guten Grund.Es ist cool, Lösung. In der Sowjetunion nannten wir solche Lösungen 'Kostyl' (es bedeutet "krummer Nagel" acording google translate)
InformationsquelleAutor Nawaz
Wenn Sie möchten, machen Sie die zweite option funktioniert, müssen Sie einen leeren Konstruktor zu
A
. Aber dies wird nicht helfen, Sie zu viel, weil dieA
- Objekt erstellt, bevor Sie den Konstruktor fürB
, so, ob Sie haben einen leeren Konstruktor oder eine consturctor, die nimmt ein Objekt des Typs int, werden Sie immer konstruieren ein Objekt vom TypA
.Wenn Ein ist so einfach, wie Sie es zeigen in dieser Probe, die ich glaube, es ist nicht eine große Sache für constuct es sogar für ungültig Dimmt. Wenn es komplexer ist, würde ich vorschlagen, Sie erstellen eine ampty consturctor für Ein, initialisiert als kleinen Teil Ein, wie möglich und dann eine
init
Methode zu tun, die komplexere Sachen.InformationsquelleAutor Ivaylo Strandjev