Klasse in main
-
Darf man keine Klasse in der main deklarieren?
Oder warum geht das hier nicht:#include <iostream> int main() { class foo { public: foo(int a); }; foo::foo(int a) { std::cout << a << "\n"; } return 0; }main.cpp:12: error: expected primary-expression before '(' token
main.cpp:12: error: expected primary-expression before "int"
main.cpp:13: error: expected `;' before '{' tokenMfG
Stromberg
-
Stromberg schrieb:
Darf man keine Klasse in der main deklarieren?
Doch man darf, allerdings unterliegen lokale Klassen bestimmten Beschränkungen, unter Anderem müssen alle Memberfunktionen inline in der Klassendefinition definiert werden.
-
// Müll....
-
camper schrieb:
Doch man darf, allerdings unterliegen lokale Klassen bestimmten Beschränkungen, unter Anderem müssen alle Memberfunktionen inline in der Klassendefinition definiert werden.
Gibt es als noch mehr Regeln für Klassen in der "main"?
Vellas schrieb:
// Müll....
????
MfG
Stromberg
-
Stromberg schrieb:
Darf man keine Klasse in der main deklarieren?
Oder warum geht das hier nicht:1. Was soll der Sinn sein? (Zumal du sie dort nicht verwendest)
2. Du darfst in einer Definition nicht die üblichen Deklarationsbedingungen erwarten. Wenn du schon Funktionslokal eine Klasse deklarieren willst:#include <iostream> int main() { // <-- Denk daran das du HIER in einer Definition von main() bist // Daher muss die Klasse auch komplett als einheit Deklariert/Definiert // werden. class foo { public: foo(int a) { std::cout << a << "\n"; } }; return 0; }
-
Die wichtigsten Einschränkungen sind:
- Deklarationen in der lokalen Klassen, können Namen des umschließenden Namensraumes so benutzen, wie es die umschließende Funktion tut. Namen der umschließenden Funktion können nur benutzt werden, wenn es sich um Typen, statische oder externe Variables oder Funktionen oder Aufzählungen handelt.
Oder einfacher negativ, man hat keine Zugriff auf automatische Variablen oder Labels. Die Memberfunktionen einer lokalen Klasse sind also nicht echt verschachtelt wie man das aus anderen Sprachen kennt, wo man in der verschachtelten Klasse Zugriff auf den gesamten Stackrahmen des Aufrufers hat.
- lokale Klassen können keine Templateargumente sein
- alle Memberfunktionen müssen, wenn überhaupt, inline in der Klassendefinition definiert werden
- lokale Klassen können keine statischen Datenmember haben
- eine in der lokalen Klasse X deklarierte Klasse Y ist ebenfalls lokal, sie kann in nerhalb der Definition von X definiert werden oder später innerhalb der Funktion