nicht den Default Konstruktor der Basisklasse benutzen
-
ich hab eine klasse, deren default konstruktor private ist, denn der soll nicht benutzt werden. Es gibt einen, der einen param nimmt:
class A { public: A(int a); private: A(); }Jetzt habe ich in der abgeleiteten Klasse einen Konstruktor, der ja, wenn man nichts dranschreibt, den defulat konstruktor aufruft, der private ist. Sie weiß aber nicht beim aufruf, welche parameter übergeben werden müssen:
class B : public A { public: B(); } B::B() // :A(12) so normalerweise, aber der konstruktor weiß noch nicht, was er übergeben soll { int i; // rechne iwie i aus A(i); }Das geht logischerweise nicht, denn implizit wird vorher A() aufgerufen, was aber ja private ist. Wie mach ich das?
-
int berechne_i() { int i; // berechne i... return i; } B::B() : A( berechne_i() ) { }Mit ner Funktion geht das. Die Funktion könntest du auch innerhalb der Klasse definieren. Dann muss sie aber static sein.
EDIT: Klammern beim Funktionsaufruf von berechne_i vergessen.
Gruß
Don06
-
Nen Ctor, der nen Funktionszeiger bekommt? ...
Wieso nicht einfach ne init() Methode?
-
Was du suchst ist "protected".
class Base { public: Base(int a, int b) : m_a(a), m_b(b) {} protected: Base() : m_a(0), m_b(0) {} private: int m_a; int m_b; }; class Derived : public Base { public: Derived() : Base() {} }; int main() { Base b(1, 2); Derived d(); }
-
ok thx zwar nit so dolle aber was will man machen...danke
@ ohnename hmm... so meinte ich das eig nich.. ich glaub Don06' Variante gefällt mir am besten.noch eine frage:
kann ein konstruktor einer klasse einen anderen der selben klasse aufrufen oder muss man dafür so eine art init() methode schreiben`?
-
this->that schrieb:
Nen Ctor, der nen Funktionszeiger bekommt? ...
Wieso nicht einfach ne init() Methode?lol... da hab ich glatt die Klammern vergessen.
-
piXelshooter schrieb:
noch eine frage:
kann ein konstruktor einer klasse einen anderen der selben klasse aufrufen oder muss man dafür so eine art init() methode schreiben`?Ich glaube das geht nicht (was mich auch ziemlich stört an C++ und ich absolut nicht nachvollziehen kann). Du musst dir wohl oder übel ne private init() Methode schreiben.
-
Don06 schrieb:
this->that schrieb:
Nen Ctor, der nen Funktionszeiger bekommt? ...
Wieso nicht einfach ne init() Methode?lol... da hab ich glatt die Klammern vergessen.
Oh, dann meinen wir letztlich ja das selbe. Das mit dem Funktionszeiger hätte ich schon arg grausig gefunden^^
-
Ja, hatte gerade noch was in Lazarus (Pascal) gemacht. Da ruft man ne Funktion ohne Parameter so auf, aber naja.
Constructor delegation kommt im neuen C++ - Standard. Zumindest sagt das Wikipedia.
Gruß
Don06
-
piXelshooter schrieb:
ich hab eine klasse, deren default konstruktor private ist, denn der soll nicht benutzt werden.
Wenn er nicht benutzt werden soll, dann deklariere ihn erst gar nicht.
Sobald du nämlich einen Konstruktor mit Parametern deklarierst, generiert der Compiler keinen Default-Konstruktor mehr für dich.
-
cool, wusst ich net, hab das schon so oft gesehn, dachte, das muss
