 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Brandt Guest
|
Posted: Mon Jul 10, 2006 10:51 pm Post subject: Vererbung mit privatem Default-Konstruktor? |
|
|
Hallo,
ich habe eine Basisklasse, deren Defaultkonstruktor "verboten" bleiben
soll, d.h. die nur mit einem bestimmten Wert erzeugt werden darf.
Gelöst habe ich das mit einem privaten Defaultkonstruktor, weil mir noch
keine andere Methode dazu bekannt ist.
Jetzt will ich diese Klasse vererben, wobei diese Eigenschaft erhalten
bleiben soll. Leider funktioniert das nicht auf Anhieb. Untenstehender
Code wird als fehlerhaft abgewiesen ("`A::A()' is private"), kann jemand
helfen?
class A
{
public:
A(int i) { /* ...do something ... */ };
virtual ~A() {};
private:
A() {};
};
class B : public A
{
public:
B(int i) { /* ...do something else ... */ };
~B() {};
private:
B() {};
};
Danke im vorab!
Gruß,
Michael
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Jul 12, 2006 4:31 pm Post subject: Re: Vererbung mit privatem Default-Konstruktor? |
|
|
Michael Brandt <mich.brandt (AT) gmx (DOT) net> writes:
| Quote: | ich habe eine Basisklasse, deren Defaultkonstruktor "verboten"
bleiben soll, d.h. die nur mit einem bestimmten Wert erzeugt werden
darf. Gelöst habe ich das mit einem privaten Defaultkonstruktor,
weil mir noch keine andere Methode dazu bekannt ist.
|
Diese Mühe ist unnötig. Sobald Du selbst einen Konstruktor
deklarierst, wird der Compiler keinen Defaultkonstruktor generieren.
Hingegen kann dieses Idiom sinnvoll sein, wenn man den Compiler daran
hindern will, einen Kopierkonstruktor zu generieren. Es reicht dann
aber, den Kopierkonstruktor im privaten Teil der Klassendefinition zu
deklarieren, ohne ihn zu definieren (er wird ja nie aufgerufen).
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Heinz Ozwirk Guest
|
Posted: Wed Jul 12, 2006 4:45 pm Post subject: Re: Vererbung mit privatem Default-Konstruktor? |
|
|
"Michael Brandt" <mich.brandt (AT) gmx (DOT) net> schrieb im Newsbeitrag
news:e8u42v$t8$03$1 (AT) news (DOT) t-online.com...
| Quote: | Hallo,
ich habe eine Basisklasse, deren Defaultkonstruktor "verboten" bleiben
soll, d.h. die nur mit einem bestimmten Wert erzeugt werden darf. Gelöst
habe ich das mit einem privaten Defaultkonstruktor, weil mir noch keine
andere Methode dazu bekannt ist.
Jetzt will ich diese Klasse vererben, wobei diese Eigenschaft erhalten
bleiben soll. Leider funktioniert das nicht auf Anhieb. Untenstehender
Code wird als fehlerhaft abgewiesen ("`A::A()' is private"), kann jemand
helfen?
class A
{
public:
A(int i) { /* ...do something ... */ };
virtual ~A() {};
private:
A() {};
};
class B : public A
{
public:
B(int i) { /* ...do something else ... */ };
~B() {};
private:
B() {};
};
Danke im vorab!
|
Die Probleme sind die beiden Konstruktoren von B. Wenn du denen nicht sagst,
wie sie den Teil, den sie von der Basisklasse geerbt haben, initialisieren
sollen, dann versucht der Compiler es mit dem Default-ctor, und den darf er
nicht benutzen. Abhilfe schafft eine Initialisierngsliste:
B(int i): A(i) { ... }
Für den Default-ctor von B gibt es allerdings keine wirkliche Lösung. Du
kannst höchstens einen Dummy-Wert verwenden:
B(): A(42) {}
Da B::B() private ist, können diesen ctor ohnehin nur Member von B benutzen.
Besser wäre es allerdings, den Default ctor gar nicht erst zu definieren.
Wenn eine Klasse irgendeinen benutzerdefinierten ctor hat, erzeugt der
Compiler keinen eigenen Default ctor. Und das, was nicht da ist, kann auch
niemand benutzen.
HTH
Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Wed Jul 12, 2006 5:01 pm Post subject: Re: Vererbung mit privatem Default-Konstruktor? |
|
|
Michael Brandt wrote:
| Quote: | Hallo,
ich habe eine Basisklasse, deren Defaultkonstruktor "verboten" bleiben
soll, d.h. die nur mit einem bestimmten Wert erzeugt werden darf. Gelöst
habe ich das mit einem privaten Defaultkonstruktor, weil mir noch keine
andere Methode dazu bekannt ist.
Jetzt will ich diese Klasse vererben, wobei diese Eigenschaft erhalten
bleiben soll. Leider funktioniert das nicht auf Anhieb. Untenstehender
Code wird als fehlerhaft abgewiesen ("`A::A()' is private"), kann jemand
helfen?
class B : public A
{
public:
B(int i) { /* ...do something else ... */ };
|
B(int i) : A(i) { /* ...do something else ... */ };
=====Initialiiseung der Basisklasse mit dem richtigen Konstruktor. Der
Compiler kann nicht wissen, daß das i für das A bestimmt ist und nimmt
den Deafult-Konstruktor, wenn Du nichts anderes sagst. Mit der
Initialisierungsliste sagst Du explizit, welchen Konstruktor er nehmen
soll. Jetzt müßte es tun.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|