Konstruktor vs. Funktionsdeklaration - Überraschung!
Verfasst: 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:
Die Antwort: Überraschung!! a4 hat den Typ A(B (*)()) !
Dementsprechend auch der Fehler:
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?
			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;
}Dementsprechend auch der Fehler:
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?).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
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?

