Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstruktoraufrufe - Unterschiede !?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.12.2003, 10:37 Uhr
~stephanw
Gast


Hi!
Betrifft folgenden Code (Dummy-Bsp);

C++:
class Onkel
{
    int a,b;
public:
    Onkel() : a(0),b(0) {}
    Onkel(int num) : a(num),b(num) {}
    void printme () {
        std::cout
            <<"a:\t"<<a
            <<"\t"
            <<"b:\t"<<b
            <<"\n";
    }

};
int main (int argc, char **argv)
{
    Onkel on0(5);
    Onkel on1();
    Onkel on2;
    Onkel on3 = Onkel();
    on0.printme();
    on1.printme();
    on2.printme();
    on3.printme();

    exit(0);
}



Erwartungsgemäß funktioniert das Anlegen von on0,on2 und on3 ohne Probleme. on2 nutzt den Standard-Kon, on0 und on3 den parametrisierten. Dummerweise geht on1.printme() nicht ( error C2228: Der linke Teil von '.printme' muss eine Klasse/Struktur/Union sein) . Scheinbar ist das Ergebnis von Onkel on1(); irgendwas außer vom Typ Onkel !?

Daher meine Frage: Bei Nutzung des Parameter-Konstruktors ist es scheinbar Wurst, ob ich Onkel on(5); oder Onke on = Onkel(5); schreibe. Beim Standard-Konstr. funktioniert das nicht gleich. Was ist der Unterschied ?

Gruß und Danke, Stephan.

Dieser Post wurde am 08.12.2003 um 15:06 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2003, 12:35 Uhr
ao

(Operator)


Hallo Stephan,

das ist eine der Fallen, die C++ bereithält, in die du aber garantiert nur einmal reinstolperst, weil du dich dein Leben lang daran erinnern wirst. :-)

Der Grund ist: Die Zeile ist keine Variablendeklaration. Sie vereinbart kein Objekt mit Namen on1. Vergiss mal für einen Moment C++ und Objekte und denke nur in C. Dann ist

C++:
Onkel on1 ();


der Prototyp einer Funktion namens on1 mit Rückgabetyp Onkel (was immer das auch ist) und leerer Argumentliste. So etwas kann aufgerufen werden, aber es hat garantiert kein Member namens printme.

Und da C++-Compiler im Prinzip auch C-Code richtig verdauen müssen, verstehen sie die obige Zeile eben als C-Prototyp und nicht als Deklaration und Initialisierung eines C++-Objekts.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2003, 12:38 Uhr
typecast
aka loddab
(Operator)



Zitat:
ao postete
das ist eine der Fallen, die C++ bereithält, in die du aber garantiert nur einmal reinstolperst, weil du dich dein Leben lang daran erinnern wirst. :-)



Oder du bist so wie ich und machst den Fehler JEDESMAL aufs neue und ärgerst dich dann immer wieder
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.12.2003, 12:49 Uhr
~stephanw
Gast


Uuups, ja jetzt seh ich das auch Ist ja nur eine Deklaration. Manno, bin ich blöd *g* . Onkel ist ein Dummy wie Foo und Bar, mir ist grad nichts besseres eingefallen .
Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.12.2003, 12:53 Uhr
derphilipder



Soll heissen, dass der Default-Konstruktor ohne () aufgerufen wird.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.12.2003, 13:03 Uhr
ao

(Operator)



Zitat:
derphilipder postete
Soll heissen, dass der Default-Konstruktor ohne () aufgerufen wird.

Genau. Siehe die Zeile mit on2 im obigen Beispiel.

ao.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.12.2003, 14:11 Uhr
(un)wissender
Niveauwart


@ao
Mir ist das Problem auch bekannt, bin auch nur einmal reingetappt.
Was aber ist eigentlich das Problem?
Die Angabe von Funktionen in anderen Funktionen ist ohnehin nicht erlaubt, warum ist das obige Beispiel also valider Code?
Der Compiler könnte das doch immer verbieten, oder als Defaultkonstuktor ansehen...wo liegt mein Problem?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.12.2003, 14:16 Uhr
~virtual-wo-cooky-at-work
Gast



Zitat:
(un)wissender postete
Die Angabe von Funktionen in anderen Funktionen ist ohnehin nicht erlaubt, warum ist das obige Beispiel also valider Code?

Die Dklaration von Funktionen schon. Die Definition nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.12.2003, 15:12 Uhr
(un)wissender
Niveauwart


@virtual-der-wo-immer-noch-trotz-schlechter-wirtschaftlicher-lage-arbeitet
Was soll das fürn Sinn haben, dass die Deklaration erlaubt ist?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.12.2003, 15:19 Uhr
ao

(Operator)



Zitat:
(un)wissender postete
Was soll das fürn Sinn haben, ... ?

Dass die Funktion nur in einem begrenzten Bereich sichtbar ist. Damit kann man sehr genau steuern, welche Codeteile eine Funktion aufrufen können und welche nicht.

Viele Pascal-geprägte Leute kreiden es C an, dass es keine lokalen Funktionen gibt. Wenn man dieses Mittel konsequent einsetzt, gibt es sie quasi doch.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: