C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Vererbung mit privatem Default-Konstruktor?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Michael Brandt
Guest





PostPosted: Mon Jul 10, 2006 10:51 pm    Post subject: Vererbung mit privatem Default-Konstruktor? Reply with 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!

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





PostPosted: Wed Jul 12, 2006 4:31 pm    Post subject: Re: Vererbung mit privatem Default-Konstruktor? Reply with quote



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





PostPosted: Wed Jul 12, 2006 4:45 pm    Post subject: Re: Vererbung mit privatem Default-Konstruktor? Reply with quote



"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





PostPosted: Wed Jul 12, 2006 5:01 pm    Post subject: Re: Vererbung mit privatem Default-Konstruktor? Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.