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?