Seite 1 von 1

Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Mi Jun 22, 2011 6:32 pm
von fat-lobyte
Hallo. War heute mal wieder so am coden und hab mich gewundert wieso beim Definieren von Objekten einer Klasse der Konstruktor nicht aufgerufen wurde.
Seht euch folgenden Code an:

Code: Alles auswählen


struct B { };

struct A 
{
    A() { }
    A(B b) { }
    
    void myMethod() {}
};

int main()
{
    B b;

    A a1; // klar, a ist vom Typ A.
    A a2 = b; // a2 ist vom Typ A, wurde mit b initialisiert
    A a3(b); // a3 ist vom Typ A, wurde mit b initialisiert

    a1.myMethod(); a2.myMethod(); a3.myMethod();

    A a4(B()); // Quizzfrage: welchen Typ hat a4?
    
    a4.myMethod(); // Fehler.


    return 0;
}
Die Antwort: Überraschung!! a4 hat den Typ A(B (*)()) !
Dementsprechend auch der Fehler:
g++ -Wall -g construct_vs_funccall.cpp -o construct_vs_funccall
construct_vs_funccall.cpp: In Funktion »int main()«:
construct_vs_funccall.cpp:26:8: Fehler: Abfrage des Elementes »myMethod« in »a4«, das vom Nicht-Klassentyp »A(B (*)())« ist
make: *** [construct_vs_funccall] Fehler 1
Lustige Sache. Wie ihr vielleicht schon ahnt wollte ich eigentlich ein Objekt a4 des Typs A erstellen, mit einem temporären Objekt des typs B() (wieso sollte ich denn extra ein persistentes Objekt erstellen, wenn ich es nur für die initialisierung brauche?).

Drauß geworden ist die Deklaration eines Funktionszeigers, dessen Typ ich nicht ganz durchblicke. Ich tippe mal auf Zeiger auf Funktionen die B als Argument erwarten und A zurückgeben.

Hat vielleicht jemand ne Idee wie ich das Sinnvoll umgehe? Muss ich jetzt jedes mal das Element dauerhaft auf dem Stack erstellen?

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Mi Jun 22, 2011 7:40 pm
von nufan
Mit dem =-Syntax für den Konstruktor funktionierts.
http://www.parashift.com/c++-faq-lite/c ... #faq-10.21

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Mi Jun 22, 2011 8:16 pm
von fat-lobyte
dani93 hat geschrieben:Mit dem =-Syntax für den Konstruktor funktionierts.
http://www.parashift.com/c++-faq-lite/c ... #faq-10.21
Danke für den Hinweis. Der Trick mit A a((B())); Hat funktionert, wer weiß wieso ^^

Das mit dem A a = B(); Geht in meinem Kontext leider nicht, da das B() hier seltsamerweise als "const B" auftritt, und so die Überladung mit "A::A(B&& b)" nicht richtig aufgelöst wird.

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Mi Jun 22, 2011 10:45 pm
von Kerli
Eine andere, vielleicht etwas klarere Möglichkeit wäre noch mit einem static_cast:

Code: Alles auswählen

A a4(static_cast<B>(B()));
fat-lobyte hat geschrieben:Drauß geworden ist die Deklaration eines Funktionszeigers, dessen Typ ich nicht ganz durchblicke. Ich tippe mal auf Zeiger auf Funktionen die B als Argument erwarten und A zurückgeben.
Genau. Soweit ich das verstanden habe hat im Falle einer Mehrdeutigkeit eine Funktionsdeklaration Vorrang vor einer Variablendefinition.

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Do Jun 23, 2011 2:44 pm
von fat-lobyte
Kerli hat geschrieben:Eine andere, vielleicht etwas klarere Möglichkeit wäre noch mit einem static_cast:

Code: Alles auswählen

A a4(static_cast<B>(B()));
Danke. Hübsch isses nicht, aber klarer auf jeden fall.

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: So Jul 10, 2011 11:46 am
von Panke
Man muss aufpassen: Alles, was der Compiler als Funktionsdeklaration sehen kann, sieht er auch so.

mit -std=c++0x geht auch

Code: Alles auswählen

A a{B()};
siehe http://www2.research.att.com/~bs/C++0xF ... iform-init

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: So Jul 10, 2011 12:18 pm
von Xin
...womit wir wieder bei der Frage, nach den C++0x Tutorials wären...

Ich muss mich unbedingt mal mit den C++0x beschäftigen.

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: So Jul 10, 2011 3:09 pm
von Kerli
Xin hat geschrieben: ...womit wir wieder bei der Frage, nach den C++0x Tutorials wären...
Jetzt wo du das so direkt erwähnst. Das wäre doch eigentlich ein interessantes Thema für eine Artikel für den Wettbewerb. Einmal schauen was sich ergibt. Lambda Functions wären zb. interessant :)

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: So Jul 10, 2011 3:25 pm
von Xin
Kerli hat geschrieben:
Xin hat geschrieben: ...womit wir wieder bei der Frage, nach den C++0x Tutorials wären...
Jetzt wo du das so direkt erwähnst. Das wäre doch eigentlich ein interessantes Thema für eine Artikel für den Wettbewerb. Einmal schauen was sich ergibt. Lambda Functions wären zb. interessant :)
Du bist soweit ich weiß, noch nicht dabei und das Thema wäre auch noch verfügbar. Nur los! :-D

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Verfasst: Mi Jul 13, 2011 4:07 pm
von fat-lobyte
Panke hat geschrieben:mit -std=c++0x geht auch

Code: Alles auswählen

A a{B()};
siehe http://www2.research.att.com/~bs/C++0xF ... iform-init
Danke, das funzt super!