Konstruktor vs. Funktionsdeklaration - Überraschung!

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von fat-lobyte » Mi Jun 22, 2011 6:32 pm

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?
Haters gonna hate, potatoes gonna potate.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von nufan » Mi Jun 22, 2011 7:40 pm

Mit dem =-Syntax für den Konstruktor funktionierts.
http://www.parashift.com/c++-faq-lite/c ... #faq-10.21

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von fat-lobyte » Mi Jun 22, 2011 8:16 pm

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.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von Kerli » Mi Jun 22, 2011 10:45 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von fat-lobyte » Do Jun 23, 2011 2:44 pm

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.
Haters gonna hate, potatoes gonna potate.

Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von Panke » So Jul 10, 2011 11:46 am

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von Xin » So Jul 10, 2011 12:18 pm

...womit wir wieder bei der Frage, nach den C++0x Tutorials wären...

Ich muss mich unbedingt mal mit den C++0x beschäftigen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von Kerli » So Jul 10, 2011 3:09 pm

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 :)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von Xin » So Jul 10, 2011 3:25 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Konstruktor vs. Funktionsdeklaration - Überraschung!

Beitrag von fat-lobyte » Mi Jul 13, 2011 4:07 pm

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!
Haters gonna hate, potatoes gonna potate.

Antworten