Dynamische und statische Speicherbeschaffung, Klassen-Templates
-
Und in diesem Fall:
class Foo { int i; int arr[i]; public: Foo(int x) : i(x) {} }; int main() { int size; cin >> size; Foo f(size); return 0; }?
-
Error: ‘i’ undeclared here (not in a function)(C99)
oder
Error: invalid use of non-static data member ‘Foo::i’(C++)
-
mm, okay, das war wohl nichts. Aber immerhin noch was dazugelernt

Hab jetzt glaube ich alles begriffen. Danke für alle Antworten.
-
Wenn nicht frag nach...
-
Variablen die nicht statisch sind müssen immer mit dem Konstruktor initialisiert werden, deshalb die Fehlermeldung. Und ein Array kann man scheins nur durch Angabe der Grösse deklarieren (und damit wahrscheinlich auch definieren), weil das wahrscheinlich auch zum Typ gehört, der schon zur Kompilierzeit feststehen muss. Die Grösse von Objekten der Klasse steht damit von vorneherein fest.
-
Und ein Array kann man scheins nur durch Angabe der Grösse deklarieren (und damit wahrscheinlich auch definieren), weil das wahrscheinlich auch zum Typ gehört, der schon zur Kompilierzeit feststehen muss. Die Grösse von Objekten der Klasse steht damit von vorneherein fest.
So ist es.
Variablen die nicht statisch sind müssen immer mit dem Konstruktor initialisiert werden, deshalb die Fehlermeldung.

-
SeppJ schrieb:

Also ich mein, sie müssen nicht unbedingt mit dem Konstruktor initialisiert werden, aber sie dürfen nicht innerhalb der Klassendefinition initialisiert werden, also z.B:
class A { int i = 3; int k = i; };
-
Jain. Im Prinzip hast du Recht. Jedoch wurde dein Beispiel
class A { int i = 3; int k = i; };als Syntaxerweiterung in C++11 eingeführt und macht das, was man intuitiv erwarten würde. Das ist jedoch eher eine schicke Art und Weise, einen Konstruktor zu schreiben. Der Code wird aber natürlich erst bei der tatsächlichen Erzeugung eines Objektes ausgeführt.
-
In C++ 2011 geht das also? Scheinbar muss ich mal mein Code::Blocks aktualisieren.
-
climits schrieb:
Shade Of Mine schrieb:
Selbes Beispiel wie oben:
int i; cin>>i; Ding<char, i> einDing; //geht nicht Ding<char> einDing(i); //geht sehr wohlWarum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.
"i" kann in C++ "bestimmend" für alles mögliche sein. Es kann z.B. sein dass
Ding<char, 1>eine FunktionFoohat (alsoDing<char, 1>::Fooexistiert),Ding<char, 0>aber nicht (alsoDing<char, 0>::Fooexistiert nicht).
Weiters sindDing<char, 1>undDing<char, 0>vollkommen unverwandte Typen. D.h. es gibt gar keine Möglichkeit in C++ über einDing<char, wurstWasHierSteht>zu sprechen -- abgesehen natürlich über weitere Templates.Nur da Templates in C++ nicht zur Laufzeit ausgewertet werden können beisst sich der Schwanz hier in den Hund.
Es gibt allerdings eine Sprachgruppe die in dieser Richtung weit mehr erlaubt als C++, und das sind die funktionalen Sprachen.
C++ geht das ganze einfach nach dem Motto an "wir wollen statisch effizienten Code erzeugen können" an, und verbietet daher alles (viel) was das verhindern würde. Und das schliesst die dynamische Auswertung von Templates mit ein.
Viele funktionale Sprachen gehen die Sache nach dem Motto "wir wollen dass möglichst viel geht" an, und nehmen dafür in Kauf dass man ziemlich komplexe Interpreter/JIT Kombinationen, üblicherweise gepaar mit nem Garbage-Collector + schlauen Caching-Algorithmus braucht um sie in annehmbarer Zeit ausführen zu können.