Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekt-Initialisierer mit Arrays

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.05.2006, 10:55 Uhr
Oliver
S2-Pixelgeneral


Gibt es irgendeine Möglichkeit Arrays wie andere Objekte im Konstruktor zu initialisieren, also so :


C++:
class X
{
int a;
int b[2];

....
};


X::X() : a(0), b(0,0) // ??? wie bei b ?
{
b[0] = b[1] = 0; // muss man es dann zwingend so machen?
}


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2006, 11:21 Uhr
~gast
Gast


Bei größeren Arrays würd ich es mit memset(,0.) im Konstruktor machen.
Bei so kleinen Arrays - probieren mit Debugger!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.05.2006, 12:54 Uhr
xXx
Devil


OLiver: google.de meint: www.computerforum.de/thread.php?threadid=42669&sid=8c4dc499f6ce4ea9e365dbc0df009a77
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2006, 14:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Der aufruf hinter dem Doppelpunkt macht ja nichts anderes als den Konstruktor der Klasse des Elementes selbst aufzurufen. Wenn du also willst, das das array automatisch initialisiert wird müsste das array einen eigenen konstruktor haben. Du musst dann also entweder eine eigene array-klasse basteln oder halt in den eigenltihc nicht wirklich saueren Apfel beißen und in ner schleife das array durchnudeln.... eine eigene klasse für arrays zu basteln ist auch nicht notwendig. dafür kannst du die stl-klassen verwenden. z.B. std::vector
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 07.05.2006 um 14:57 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.05.2006, 11:53 Uhr
RHBaum




Zitat:

dafür kannst du die stl-klassen verwenden. z.B. std::vector



Aber bitte nicht fuer nen statisches Array mit der Groesse 2 ^^ Man kann auch mit atomwaffen auf muecken schiessen ^^

die impliziete dynamische erzeugung des arrays bei nem STL container waer mir dafuer definitiv zu viel overhaed ....

@Oliver
Arrays zu initialisieren iss immer nen greul unter C++, und geht meist nicht besser.
Befuell das ding per hand, oder per schleife, bei groesseren bloecken mit gleichem inhalt dann besser mit memset .... wie oben geraten halt.


Ciao ...

Dieser Post wurde am 08.05.2006 um 11:56 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.05.2006, 13:50 Uhr
Th



Für Array-Initialisierungen nutze ich immer eine der beiden folgenden Funktions-Templates:


C++:
template<typename AT, typename T> void init_array(AT array[], int N, const T& t)
{
    for(int i=0; i<N; i++)
        array[i] = t;
}

template<typename AT, typename T> void init_array(AT &array, const T& t)
{
    const int N = sizeof(array) / sizeof(T);
    for(int i=0; i<N; i++)
        ((T*)&array)[i] = t;
}



memset ist nur wirklich sinnvoll bei 0 oder 0xFF (-1), denn bei z.B.

C++:
memset(b, 2*sizeof(int), 1)


wird nämlich jedes Byte auf 1 gesetzt, d.h. ein int hätte dann den Wert 0x01010101.

Aufgerufen würden die Templates dann mit

C++:
const int nInitValue = 42;
init_array(b, 2, nInitValue); // nur eines der beiden muß aufgerufen werden
init_array(b, nInitValue); // bei statischen Arrays kannst du diese Funktion aufrufen, da sie die Größe des Arrays automatisch ermittelt (vom Compiler)

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.05.2006, 14:57 Uhr
RHBaum



@ TH

Naja, ob ich im Konstruktor ne Schleife oder nen Template konstrukt aufrufe, beides macht die Sache nicht elegant (IMHO), obwohl elegant natuerlich geschmackssache ist ...
Zumindest iss das dem Threadersteller an dieser Stelle sein Problem ^^

Wenn ich mit Templates auf das problem schiessen wuerd, dann nur um die initialisierungsroutine in die Initialisierungsliste zu bekommen ...

Also dann lieber nen statisches Array als Template Klasse implementieren und gleich nen Konstruktor mit nem parametriesierten defaultwert anbieten, oder den defaultwert gleich in die Template Parameter aufnehmen ....

So das seine Aufrufsyntax etwa so aussieht :
class X
{
int a;
StaticArrayClass<int,2> b;
....
};

X::X() : a(0), b(0) // So sollte es dann gehen ....
{

}

Wenn man das oefters braucht, sowas schick findet oder noch mehr komfort auf die arrays pressen will, sollt man sich das echt ueberlegen, ansonsten isses wahrscheinlich einfach zu viel (Programmiertechnischer) aufwand fuer diese rein kosmetische Sache ....

Recht geb ich dir mit dem memset problem.
Das ist nur bei ganz bestimmten dingen sinnvoll ... und verbessert die performance eigentlich auch nur geringfuegig bei Faellen mit zu vielen Randbedingungen ...
auch ist memset bei unterschiedlichen Impls unterschiedlich performant implementiert ... so kann es grad bei Datentypen mit ner groesse eines vielfachen von 4 die schleifenversion doch performanter sein .... das muesste man aber mit dem profiler checken und schaun ob das ueberhaupt relevant ist ...
wenn man 4 byte muster haben woellte gehts ja eh nich ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.05.2006, 10:30 Uhr
Th



Wenn jemand noch Interesse an einer statischen Array-Klasse hat, so schicke ich ihm gerne diese zu (Interface wie std::vector, nur eben feste Array-Größe).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: