Array aus Struct füllen
-
Hallo,
warum geht das nicht:struct Origin { int x0[3]; }Org; Org.x0[3] = {1,2,3};Das geht doch auch:
int arr[3] = {1,2,3};Danke schön
-
Falsche Arraysyntax. Du musst/darfst nicht jedesmal angeben, wieviele Elemente du hast:
Org.x0[3] = {1,2,3}; // falschDu meinst wohl eher:
Org.x0 = {1,2,3};Folgendes kann man übrigens auch machen, wenn der Struct hinreichend einfach aufgebaut ist:
Origin foo = {1,2,3};
-
Weil das mit den geschweiften Klammern lediglich für die Initialisierung geht. Bei dem struct wird die Initialisierung im Konstruktor gemacht und du hast nachher eine Zuweisung. Und bei einer Zuweisung kannst du das nicht benutzen. Da musst du wohl oder übel drüber iterieren, wenn du ein Array in einer Klasse füllen willst.
-
drakon schrieb:
Weil das mit den geschweiften Klammern lediglich für die Initialisierung geht. Bei dem struct wird die Initialisierung im Konstruktor gemacht und du hast nachher eine Zuweisung. Und bei einer Zuweisung kannst du das nicht benutzen. Da musst du wohl oder übel drüber iterieren, wenn du ein Array in einer Klasse füllen willst.
Hmm, also gcc schluckt diese Variante:
Org.x0 = {1,2,3};Compilerfeature oder irgendein Teil des Standards den du vergessen hast?
-
Ich würde mal sagen, dass da der GCC weiter ist und das bereits was von C++0x implementiert hat. (initializer list).
VS 2008 nimmt das nämlich auch nicht.
Hast du vlt. die Erweiterung drin?
-
drakon schrieb:
Hast du vlt. die Erweiterung drin?
Jo, hab's gerade in der Doku gefunden, dass es ein neues Feature ist. Hmm,, angeblich erst ab 4.4 aber ich habe 4.2 auf diesem Rechner. Merkwürdig

-
Hallo,
danke für eure Antworten. Ich kann das schreiben:int arr[3] = {1,2,3};Ich kann aber nicht das schreiben:
int arr[3]; arr = {1,2,3}Ich muss jetzt aber jedem Element eine ganz bestimmte Zahl zuweisen. Daher wollte ich das eigentlich so machen. Gibt es eine Alternative, da sich eine Schleife eher nicht anbiete, da diese ja sehr lang wäre:
for(int i=0; i<3; i++) { if (i==0) arr[i] = ...; if (i==1) arr[i] = ...; //Das ist doof, weshalb ich eigentlich die obere Variante schreiben wollte, aber das geht ja leider nicht :( }Könnt ihr mir da helfen?
Danke schön
-
Da fehlt eine Semikolon...sry.
-
Du kannst das über ein temporäres Array machen, wenn du die Daten nicht eh von wo anderst kriegst. (z.B aus einem File).
int arr[3]; int temp[3] = {1,2,3}; for (int i = 0; i < 3; ++i) arr[ i ] = temp[ i ];Macht natürlich nur Sinn, wenn die direkte Variante nicht geht, aber so kannst du bis auf 2 Zeilen genau gleich initialisieren. (z.B kannst du das im Konstruktor schreiben)
-
Mmmh...das hilt mir hier nicht weiter. Ich habe hier ein Array, das Member eine Klasse ist. Dieses möchte ich im Konstruktor mit ganz bestimmten Zahlen füllen. Der Konstruktor würde riesig groß, wenn ich das mit for - if machen würde. Deswegen hilft auch kein temp Array, da dass ja auch erstmal gefüllt werden muss.
Gibt es da keine einfache Lösung, da ich die Initialiserung ja leider nicht in die Klassendeklaration schreiben darf.
Danke schön
-
Hey, deine temp Variante funktioniert doch. Ich habe eben nur falsch herum gedacht. Danke! Ist das eine legitime Lösung oder gibt es was schöneres (nicht das ich bezweifel, dass die Lösung nicht schön ist)
Danke schön
-
Wie gesagt du hast bei meinen Beispiel bis auf 2 Zeilen genau gleich viel Schreibarbeit, wie wenn du es direkt so schreiben könntest, wie du willst.
Wo siehst du bei mir überhaupt ein if?!Nochmal zum mitschreiben:
struct Origin { int x0[3]; Origin () // Konstruktor { int temp[3] = {1,2,3}; // temporär, kannst du wie gewünscht initialisieren for (int i = 0; i < 3; ++i) // anstatt der Schleife könntest du auch memcpy benutzen.. x0[ i ] = temp[ i ]; } };
-
Ok, du scheinst es begriffen zu haben.

Naja. Üblicherweise schreibt man solche Daten nicht einfach in den Code rein, sondern lädt sie z.B aus einem File. Das würde das ganze recht flexibel machen. Aber wenn du das _wirklich_ im Code hast, dann kann man das durchaus so machen.
-
Um die For-Schleife zu sparen, kann der STL-Algorithmus
std::copy()eingesetzt werden. Wenn es allerdings nur darum geht, ein Array mit aufsteigenden Zahlen zu füllen, kann man das gleich in einer Schleife tun – und zwar ohne temporäres Array.
-
Ok, danke für den Hinweis. Noch eine Frage. Warum funktioniert solch ein Konstruktor nicht? ICh möchte ihn nämlich nicht wie in deiner Version, drakon, inline haben:
Origin::Origin() { //mach was }Ich dachte eine struct wäre auch einfach nur eine Klasse!
Danke schön
-
Zeig mal den ganzen Code. Eigentlich sollte es funktionieren. Und ja, du hast Recht, Structs sind auch Klassen, nur von Grund auf Public.
-
struct schrieb:
for(int i=0; i<3; i++) { if (i==0) arr[i] = ...; if (i==1) arr[i] = ...; //Das ist doof, weshalb ich eigentlich die obere Variante schreiben wollte, aber das geht ja leider nicht :( }Erscheint mir etwas umständlich. Einfacher ist
arr[0] = ...; arr[1] = ...; arr[2] = ...;Die Variante mit dem temporären Array ist natürlich trotzdem besser.
-
Das Problem ist, dass meine struct Member eine KLasse ist. Sie ist als private deklariert. Deswegen funktioniert solch ein Konstruktor nicht. Aber wie muss dieser denn dan geschrieben werden:
TClass::Origin::Origin() { //ist das korrekt? }Das Problem ist nun, dass ich vom Konstruktor meiner struct auf eine Eigenschaft von TClass zugreifen möchte. Wie läuft das? Das funktioniert nämlich nicht:
TClass::Origin::Origin() { TClass::Eigenschaft = 5; //sieht sehr komisch aus! }Dankeschön
-
Sofern TClass kein Namespace oder Origin ein nested class von TClass ist, ist das Unsinn.
Zeig mal genau, was TClass sein soll und was du da probierst zu machen..

-
Ich kann euch leider noch nicht mehr geben, da es noch nicht mehr gibt :p .
Ich möchte eine Klasse erstellen (TClass), die ein als private deklarietes Struct (Origin). Außerdem gibt es eine private deklarierte Variable. Nun möchte ich den Konstruktor des structs aufrufen und darin auf die private Variable von TClass zugreifen. Geht das überhaupt?
Danke
-
Ach ja, ich möchte nämlich einer struct Variable den Wert der privaten TClass Variable zuweisen und zwar im KOnstruktor!