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 

Standardkonstruktoren???

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





PostPosted: Thu Oct 07, 2004 8:41 am    Post subject: Standardkonstruktoren??? Reply with quote



Hallo Leute,

nach meinem Verständnis legt C++ Standardkonstruktoren an, wenn ich selbst
keine Konstruktoren angegeben habe. Hat eine Klasse Beispielsweise einen
(int)-Konstruktor, so wird kein Standardkonstruktor angelegt. Des weiteren
bin ich der Meinung, dass Konstruktoren protected-vererbt werden, außer man
hat ausschließlich (void)-Konstruktoren verwendet, bzw. sich auf das
automatische Hinzufügen des Standardkonstrukors verlassen. Sollte ich mich
in irgendeinem Punkt irren, dann sagt es mir bitte.

class c_A
{
public:
c_A() {}
c_A(int) {}
};

class c_B : public c_A
{
public:
c_B(int) {}
};

int main(int argc, char* argv[])
{
c_B B1(); // Zeile wird vom Compiler akzeptiert
c_B B2; // Compiler kann Standardkonstruktor nicht finden
return 0;
}

Wieso kann der Compiler dann in diesem Beispiel B1 erzeugen und B2 nicht?
Das Verhalten bei B2 ist nach meiner Auffassung der C++-Regeln korrekt.

Viele Grüße,
Steffen

--
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
Rolf Magnus
Guest





PostPosted: Thu Oct 07, 2004 10:24 am    Post subject: Re: Standardkonstruktoren??? Reply with quote



Steffen Liersch wrote:

Quote:
Hallo Leute,

nach meinem Verständnis legt C++ Standardkonstruktoren an, wenn ich
selbst keine Konstruktoren angegeben habe.

Ja.

Quote:
Hat eine Klasse Beispielsweise einen (int)-Konstruktor, so wird kein
Standardkonstruktor angelegt.

Auch richtig.

Quote:
Des weiteren bin ich der Meinung, dass Konstruktoren protected-vererbt
werden, außer man hat ausschließlich (void)-Konstruktoren verwendet,
bzw. sich auf das automatische Hinzufügen des Standardkonstrukors
verlassen.

Nein. Konstruktoren werden nicht vererbt.

Quote:
Sollte ich mich in irgendeinem Punkt irren, dann sagt es mir bitte.

class c_A
{
public:
c_A() {}
c_A(int) {}
};

class c_B : public c_A
{
public:
c_B(int) {}
};

int main(int argc, char* argv[])
{
c_B B1(); // Zeile wird vom Compiler akzeptiert
c_B B2; // Compiler kann Standardkonstruktor nicht finden
return 0;
}

Wieso kann der Compiler dann in diesem Beispiel B1 erzeugen und B2 nicht?

Weil B1 kein Objekt ist, sondern eine Funktion. c_B B1() deklariert eine
Funktion, die keine Parameter hat und ein c_B zurückliefert. c_B B2
definiert dagegen ein Objekt vom Typ c_B.

Quote:
Das Verhalten bei B2 ist nach meiner Auffassung der C++-Regeln korrekt.

Beide sind korrekt. Das erste tut nur etwas anderes, als du erwartet
hattest, nach dem Motto: "Der Computer tut nicht das, was du willst,
sondern das, was du programierst." ;-)

PS: Könntest du mal deinen Newsreader so einstellen, daß er nicht vergisst,
das Encoding in den Postings anzugeben? Dann würden Umlaute besser
funktionieren.

--
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
Tibor Pausz
Guest





PostPosted: Thu Oct 07, 2004 10:34 am    Post subject: Re: Standardkonstruktoren??? Reply with quote



Steffen Liersch <steffen_liersch_pub (AT) gmx (DOT) de> wrote:

Quote:
c_B B1(); // Zeile wird vom Compiler akzeptiert
^^^^^^^^^

Das ist eine Funktionsdefinition!

Quote:
c_B B2; // Compiler kann Standardkonstruktor nicht finden

Der ist ja auch nicht deklariert.

--
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
Horst Kraemer
Guest





PostPosted: Thu Oct 07, 2004 12:21 pm    Post subject: Re: Standardkonstruktoren??? Reply with quote

"Steffen Liersch" <steffen_liersch_pub (AT) gmx (DOT) de> wrote:

Quote:
Hallo Leute,

nach meinem Verständnis legt C++ Standardkonstruktoren an, wenn ich selbst
keine Konstruktoren angegeben habe.

Ja. Einen Konstruktor der sich so verhaelt wie ein selbst definierter
c'tor

X::X() {}

sowie einen copy-c'tor

X::X(const X&);
oder
X::X(X&);

der elementweise kopiert. Ob der automatisch generierte copy-c'tor
einen Parameter X& oder const X& hat, haengt von der eventuellen
Vererbung ab. Er ist const X&, es sei denn, die Basisklasse besitzt
bei einfacher Vererbung einen copy-c'tor vom Typ B::B(B&) ohne const.

Quote:
Hat eine Klasse Beispielsweise einen
(int)-Konstruktor, so wird kein Standardkonstruktor angelegt.

Eine Standard-copy-c'tor wird aber trotzdem angelegt, wenn man selbst
keinen definiert und wenn die notwendigen Bedingungen dafuer vorliegen
(siehe dazu unten).

Quote:
Des weiteren
bin ich der Meinung, dass Konstruktoren protected-vererbt werden, außer man
hat ausschließlich (void)-Konstruktoren verwendet, bzw. sich auf das
automatische Hinzufügen des Standardkonstrukors verlassen. Sollte ich mich
in irgendeinem Punkt irren, dann sagt es mir bitte.

Konstruktoren werden in C++ *nie* vererbt. Dies ist technisch gar
nicht moeglich, denn ein c'tor fuer eine Klasse X:B kann den B::B() ja
nicht fuer sich selbst verwenden. Die Konstruktoren einer neuen Klasse
sind immer selbst "neu". Was bringt Dich auf die Interpretation, dass
Konstruktoren "protected vererbt" werden?

Vielleicht beziehst Du dich auf so etwas:

struct A
{
A(int);
};

struct B:A
{};

int main()
{
A a(1); // OK
B b; // Fehler
}

Das System kann hier keinen Standard-c'tor fuer B generieren. Ein
Standard-c'tor kann nur dann generiert werden, wenn fuer alle
Basisklassen und fuer eventuelle Elemente, die ebenfalls Klassen sind,
jeweils (selbst definierte oder automatisch generierte)
Standard-c'toren vorliegen. Hier besitzt die Basisklasse A keinen
Standard-c'tor und damit ist die automatische Generierung eines B::B()
nicht moeglich.

Dies liegt aber nicht an Vererbungsgeschichten fuer Konstruktoren,
sondern daran, dass in C++ Klassen wie Zwiebeln von innen nach aussen
aufgebaut werden. Schematisch verlaeuft die Auswfuehrung einer
Konstruktion eines Objekts vom Typ B:A so

1) Ausfuehrung von c'toren fuer alle Basisklassen von B
2) Ausfuehrung von c'toren fuer alle Klassenelemente von B
3) Ausfuehrung des Anweisungsteils des B-c'tors.

Bei der Ausfuehrung eines c'tors fuer B:A verwendet das System also
implizit oder auch explizit einen c'tor fuer A, aber die Klasse B erbt
ihn deswegen nicht, sie muss nur Zugriff auf ihn haben, und das hat
sie, es sei denn A::A() waere private.

Ein automatisch generierter B::B() einer Klasse B:A entspricht also
einem expliziten ctor dieser Form

B::B() : A() {}

und er kann eben nicht generiert werden, wenn es keinen zugaenglichen
A::A() gibt.

--
Horst

--
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
Steffen Liersch
Guest





PostPosted: Thu Oct 07, 2004 1:51 pm    Post subject: Re: Standardkonstruktoren??? Reply with quote

Hallo Rolf,

Quote:
Des weiteren bin ich der Meinung, dass Konstruktoren protected-vererbt
werden, au er man hat ausschlielich (void)-Konstruktoren verwendet,
bzw. sich auf das automatische Hinzuf gen des Standardkonstrukors
verlassen.

Nein. Konstruktoren werden nicht vererbt.


Die Konstruktoren der Basisklassen werden ja immer aufgerufen. Damit hat
eine neue Klasse ja dieses Verhalten geerbt. Es ist auch klar, dass ein
Konstruktor sich nur um die Elemente kümmern kann, die in der entsprechenden
Klasse definiert wurden. Aber zu sagen, dass ein Konstruktor nicht vererbt
wird, ist doch eigentlich falsch. Denn dann müsste er ja für eine
abgeleitete Klasse überhaupt nicht verfügbar sein, also noch weniger
verfügbar als ein privates Objekt, was ja immerhin auch für abgeleitete
Klassen existiert, jedoch nicht zugreifbar ist.

Quote:
int main(int argc, char* argv[])
{
c_B B1(); // Zeile wird vom Compiler akzeptiert
c_B B2; // Compiler kann Standardkonstruktor nicht finden
return 0;
}


OK, das erklärt natürlich alles. Ich bin nur darauf gestoßen, weil ich
irgendwo den RAII-Mechanismus benutze und für meinen Konstruktor Parameter
benötige. Igrendwo hatte ich versehentlich noch keine Parameter eingetragen,
jedoch die Klammern schon hingeschrieben. Das ist natürlich dann eine
ziemliche Falle, da der eigentliche Effekt ja nicht zum Tragen kommt. Also
danke für den Tip.

Quote:
PS: Könntest du mal deinen Newsreader so einstellen, daß er nicht
vergisst,
das Encoding in den Postings anzugeben? Dann würden Umlaute besser
funktionieren.

Ich benutze Outlook Express. Wo soll ich da was einstellen, damit meine
Umlaute besser funktionieren?

Viele Grüße,
Steffen

--
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
Rolf Magnus
Guest





PostPosted: Thu Oct 07, 2004 2:41 pm    Post subject: Re: Standardkonstruktoren??? Reply with quote

Steffen Liersch wrote:

Quote:
Hallo Rolf,

Des weiteren bin ich der Meinung, dass Konstruktoren protected-vererbt
werden, au er man hat ausschlielich (void)-Konstruktoren verwendet,
bzw. sich auf das automatische Hinzuf gen des Standardkonstrukors
verlassen.

Nein. Konstruktoren werden nicht vererbt.


Die Konstruktoren der Basisklassen werden ja immer aufgerufen.

Ja.

Quote:
Damit hat eine neue Klasse ja dieses Verhalten geerbt.

Vererbung bezeichnet aber nicht das Verhalten, sondern nur, welche Members
es gibt. Und wenn ich in der Basisklasse einen Konstruktor schreibe, der
einen int annimmt, kann ich die abgeleitete Klasse deshalb noch nicht mit
einem int-Parameter konstruieren.

Quote:
OK, das erklärt natürlich alles. Ich bin nur darauf gestoßen, weil ich
irgendwo den RAII-Mechanismus benutze und für meinen Konstruktor
Parameter benötige. Igrendwo hatte ich versehentlich noch keine Parameter
eingetragen, jedoch die Klammern schon hingeschrieben. Das ist natürlich
dann eine ziemliche Falle, da der eigentliche Effekt ja nicht zum Tragen
kommt. Also danke für den Tip.

Ja, das ist eine Falle, in die viele tappen. Man merkt es sich danach aber
dann doch relativ schnell. ;-)

Quote:
PS: Könntest du mal deinen Newsreader so einstellen, daß er nicht
vergisst, das Encoding in den Postings anzugeben? Dann würden Umlaute
besser funktionieren.

Ich benutze Outlook Express. Wo soll ich da was einstellen, damit meine
Umlaute besser funktionieren?

Hmm, ich kenne mich mit Outlook Express nicht so aus, aber es gibt bestimmt
irgendwo eine Einstellung, wo man ein Encoding, Charset, Zeichentabelle,
Kodierung oder wie auch immer es heißt auswählen kann. Das sollte utf-8
oder iso-8859-15 (bzw. iso-8895-1, das hat aber kein Euro-Zeichen) sein.
Normalerweise steht im Header eines Newsbeitrags das verwendete Charset,
aber scheinbar vergißt OE, das mit anzugeben, wenn man nicht explizit eins
auswählt, obwohl er ja trotzdem eins verwendet.

--
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.