Array als privat deklariert, im Konstruktor ausfüllen?
-
Hallo,
am Besten mach ich gleich ein Beispiel um mein Problem zu erläutern:
class test { public: test() { array[2] = {"hi", "du"}; } private: string array[2]; };Dies klappt leider nicht, gibt es einen anderen Weg dies zu tun?
-
nein
-
class test { public: test() { array = {"hi", "du"}; } private: string array[2]; };oder
class test { public: test() { array[0] = "hi"; array[1] = "du"; } private: string array[2]; };
-
hjkhjk schrieb:
class test { public: test() { array = {"hi", "du"}; } private: string array[2]; };oder
class test { public: test() { array[0] = "hi"; array[1] = "du"; } private: string array[2]; };Bist du sicher die erste VErsion klappt? Tut es leider nicht bei mir...
-
Die erste Verison ist falsch. Du kannst so ein Array nicht direkt Initialisieren. Sondern nur Objekt für Objekt im Konstruktorrumpf (nicht in der initialisierungsliste)
-
Danke für die Aufklärung!
Hab nochmals ne Frage mit Arrays, ich versuche gerade ein eindimensionales Array als Rückgabewert einer Funktion zu deklarieren, dies möchte einfach nicht klappen!
Hat jemand irgend ne Idee wie man das richtig macht?
#include <string> #include <iostream> using namespace std; int[2] returnMe() { // int* returnMe() klappt auch nicht int array[2] = {"hi", "du"}; return array; } int main() { int array[2]; array = returnMe(); cout << array[0] << array[1] << endl; cin.get(); return 0; }
-
Was passiert denn, wenn du das Ergebnis ausgiebst? Es ist 100%tig undefiniert. Das Array wird in der Funktion definiert und existiert somit nur innerhalb dieses Scopes. Nach Verlassen der Funktion verschwindet das erstellte Array vom Stack und dein Pointer zeigt auf einen Speicherbereich, das nicht dem Programm gehört. Alternativ kannst du das Array auf dem Heap alloziieren:
int* array(int size) { return new int[size]; } int* arr = array(5); arr[0] = 5; delete [] arr;Über den Sinn eines solchen Unterfangens lässt sich streiten.
Edit: weil es Nexus gerade unten angesprochen hat, dieses Beispiel hat Nachteile:
a) Ein Programmierer kann das delete schnell vergessen, da er ja kein new sieht.
b) Es ist kein bisschen exceptionsicher. Wenn eine Exception geworfen wird, kann man sich sicher sein, dass kein delete aufgerufen wird --> Memory LeakWenn man aber tatsächlich Ressourcen in Form eines Heaparrays benötigt, gibt es von Boost AFAIR einen Smart-Pointer für Arrays, die dank Stackunwinding automatisch gelöscht werden.
-
Samyboy schrieb:
Hab nochmals ne Frage mit Arrays, ich versuche gerade ein eindimensionales Array als Rückgabewert einer Funktion zu deklarieren, dies möchte einfach nicht klappen!
Hat jemand irgend ne Idee wie man das richtig macht?
Da gibts mehrere Möglichkeiten. Zu Ad aCTas Beispiel würde ich allerdings nicht raten.
- Arbeite mit dem Array-Wrapper
std::tr1::array, der Kopiersemantik unterstützt. - Arbeite mit
std::vector. - Schreibe dir eine Funktion, die einen Zeiger auf Anfang und Ende des Arrays verlangt und es befüllt (ganz im Iterator-Stil).
Ich rate zu Punkt 1 oder 2, die kannst du immer noch mit einer Funktion befüllen. Oder du lässt dir von einer Funktion gleich ein Objekt zurückgeben, mit dem du deinen Container initialisierst.
- Arbeite mit dem Array-Wrapper
-
Danke!
Werde mir mal die Boost Library näher anschauen.
-
Samyboy schrieb:
Danke!
Werde mir mal die Boost Library näher anschauen.
Machs doch einfach mit der STL.
std::vector
-
Icematix schrieb:
Samyboy schrieb:
Danke!
Werde mir mal die Boost Library näher anschauen.
Machs doch einfach mit der STL.
std::vectorNunja vectoren sind ja dynamische Arrays, ich brauche aber in meinem Fall kein dynamisches. Soll ich trotzdem Vector verwenden? Vectoren sind toll xD
-
> ich brauche aber in meinem Fall kein dynamisches.
Nein? Dann nimm std::tr1::array (falls vorhanden), wie Nexus sagte, und kopiere es als Rückgabewert. Dieses Array basiert auf Stack-Speicher und ist so komfortabel wie std::vector, nur statisch.