Forum: PC-Programmierung Klassen Member Array Initialisierung in C++


von Peter Schmitt (Gast)


Lesenswert?

Hallo Forum o/

ich habe eine Frage zur Initialisierung von Array Membern einer Klasse 
in C++ in der Initialisierungsliste. Beim CodeReview ist mir öfters 
sowas hier unter gekommen:

Deklarationen:
1
*.h
2
float bufferA[A][B]
3
int buffer[C]
4
AnotherClass* array[D]

Dazugehöriger Klassenconstruktor Definition dann:
1
*.cpp
2
MyClass::MyClass() :
3
bufferA({}),
4
buffer({}),
5
array({})

Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
1
Type mismatch (initialization) (int [4320] = int)

Deshalb meine Frage: ist die Initialisierung so überhaupt zulässig? 
Konnte darüber leider nichts finden. Gibt es denn überhaupt dann eine 
Möglichkeit dies in der Initialisierungsliste zu tun? Die Möglichkeit im 
Konstruktorrumpf selbst ist mir bekannt.

Schönen Gruß,
Peter

von Oliver S. (oliverso)


Lesenswert?

Je nun, mit welcher C++-Version bist du unterwegs, was sagt der Compiler 
dazu, was hast du dazu auf den einschlägigen Internetseiten (z.B. 
Cplusplus.com) nachgelesen, und was steht dazu in deinem C++-Buch?

Jemand, der Codereviews durchführt, sollte all diese Antworten 
griffbereit haben.

Oliver

von Peter Schmitt (Gast)


Lesenswert?

Mea culpa - die dazugehörigen Informationen waren für wahr ein wenig 
dünn. Genauer:

* C++03
* mein gcc sagt überhaupt nichts dazu
* Die Aussagen auf bspw. stackoverflow sind widersprüchlich, zum 
Beispiel hier: 
http://stackoverflow.com/questions/11837078/initialize-a-constant-sized-array-in-an-initializer-list
* Meine Literatur gibt nur Material her für eine direkte Initialisierung 
mit Werten: array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Mir geht es aber explizit um die Möglichkeit mit ({ }), sowie der 
best-practise Variante

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

PC lint ist auch nur ein "Compiler" und wird auch so seine bugs haben. 
Initializer Syntax ist ja erst mit C++11 aufgenommen worden. Kann PC 
Lint C++11?

Persönlich finde ich die leeren Arrays in der in der 
Initialisierungsliste ja recht überflüssig.

von Pit (Gast)


Lesenswert?

Torsten R. schrieb:
> PC lint ist auch nur ein "Compiler" und wird auch so seine bugs haben.
> Initializer Syntax ist ja erst mit C++11 aufgenommen worden. Kann PC
> Lint C++11?
>
> Persönlich finde ich die leeren Arrays in der in der
> Initialisierungsliste ja recht überflüssig.

Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.
Bei sowas - int data[17]; - steht irgendwelcher Mist drin.

Gruß Pit

von Brad (Gast)


Lesenswert?

Pit schrieb:
> Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.

Genauer gesagt wird für jedes Array-Element der Standardkonstruktor 
aufgerufen. In Falle der primitiven Datentypen wären das dann die 
"Pseudo"-Konstruktoren int() und float(), die definitionsgemäß mit 0 
bzw. 0.0f initialisieren.

von Carl D. (jcw2)


Lesenswert?

> Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
> Type mismatch (initialization) (int [4320] = int)

Dann scheint es die leere Intializer-Liste für Arrays nicht richtig zu 
verstehen und hat "{}" dann zu "{0}" übersetzt, was aber auch valides 
C++ ist und genau das gleiche, "::memset(array,0,sizeof(array));", 
machen sollte

Schönes Beispiel, wie veraltete Richtlinien den Einsatz verbesserter 
Verfahren be(/ver)hindern können.

Kauf dir ein besseres Lint oder glaub den Compilerwarnings.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.