Static Array in Header
-
Mitleid schrieb:
unskilled schrieb:
size_t countable::count = 0;Das wollen wir aber nicht im Header sehen.
1. hab ich das gar net gesagt, dass es im header stehen muss (und net in der *.cpp)
und
2. würd ich es in den header schreiben, weil es unwahrscheinlich ist, dass man bei ner anderen zahl anfangen will, zu zählen...
bb
-
unskilled schrieb:
2. würd ich es in den header schreiben, weil es unwahrscheinlich ist, dass man bei ner anderen zahl anfangen will, zu zählen...

Mach das mal. Danach baust du den Header in mehr als eine Übersetzungseinheit ein und freust dich dass der Linker dich anmeckert

-
pumuckl schrieb:
unskilled schrieb:
2. würd ich es in den header schreiben, weil es unwahrscheinlich ist, dass man bei ner anderen zahl anfangen will, zu zählen...

Mach das mal. Danach baust du den Header in mehr als eine Übersetzungseinheit ein und freust dich dass der Linker dich anmeckert

es sei denn, ich hab pragma once im header stehen

-
unskilled schrieb:
es sei denn, ich hab pragma once im header stehen

Header Guards schützen dich davor nicht. Das Problem ist, dass die Variable dann in mehrere Übersetzungseinheiten definiert ist. Dadurch hast du ein "Multiple Definition Error" beim Linken.
Grüssli
-
unskilled schrieb:
es sei denn, ich hab pragma once im header stehen

Probiers aus

//test.h #pragma once //oder "normale" include guards struct X { static int i; }; int X::i = 0; //test.cpp #include "test.h" //main.cpp #include "test.h" int main() {}compilieren...
main.obj : error LNK2005: "private: static int X::i" (?i@X@@0HA) already defined in test.obj D:\Profile\pumu\Eigene Dateien\cpptests\Debug\cpptests.exe : fatal error LNK1169: one or more multiply defined symbols found
-
das es normale include-guards nich tun, war mir klar, aber ich dachte bisher immer, dass pragma once das unterbinden würde (das es zwar net dafür gedacht ist, aber es das trotzdem tun sollte) - aber habs gerad getestet ... naja - wieder was dazugelernt ^^
bb
edit: jopp - hab ich genau so ausprobiert
war nur ma wieder zu langsam 
-
unskilled schrieb:
das es normale include-guards nich tun, war mir klar, aber ich dachte bisher immer, dass pragma once das unterbinden würde (das es zwar net dafür gedacht ist, aber es das trotzdem tun sollte) - aber habs gerad getestet ... naja - wieder was dazugelernt ^^
bb
edit: jopp - hab ich genau so ausprobiert
war nur ma wieder zu langsam 
pragma once ist nur ein (nicht portabler) Ersatz für die normalen include guards. nicht mehr und nicht weniger.
-
Hallo,
ich habe eine Klasse mit Header und Impl. Datei.
Ich weiß das ich static also Klassenvariablen nicht im Header init. kann
sondern nur in der Impl. Datei!
=> Ich weiß nicht wie ich ein Array deklariere ohne es zu init.
GLFloat ist nur ein OpenGL Datentyp... ihr könnt euch auch einfach ein float Array vorstellen!
------------------
Ich wollte das Array dann als Klassenmember definieren aber leider kann man keine Arrays in der Init.liste anlegen!!
Was kann ich nun tun?
Ich hab nun das Array einfach als Einheitsglobal in die Impl. Datei getan aber das ist nicht OOP

Danke!
-
Stichwort: dynamisches Array. Oder gleich vector.
-
Konvertiert Cpp einen Vector automatisch in ein Float Array?
Und anderst geht es nicht?!
Ich hab schon überlegt einfach ein Zeiger auf GLFloat aber das ging leider auch nicht

-
sdfsdf schrieb:
Konvertiert Cpp einen Vector automatisch in ein Float Array
Nein. aber &vec[0] ist ein Pointer auf den Arrayanfang.
Aber du verstößt gegen eine der wichtigsten Regeln wenn man Fragen stellt - du erzählst uns die ganze Zeit was du tun willst, nicht was du damit erreichen möchtest bzw. wozu du es benutzen möchtest. Bevor du uns das erklärst kann man dir eigentlich nur eine Antwort geben: Dein Ansatz ist nicht praktikabel, was auch immer du damit erreichen möchtest...
-
Tut mir Leid ich weiß nicht was du von mir willst!
Ich will ein statisches Array in einer Klasse und es verwenden in meiner Implementierung... was will ich erreichen!
Es hilt zwar überhaupt nicht wenn ich dir schreibe, dass dieses GLFloat Array eine RGB Farbe enthält und ich es in einer Memberfunktion aufrufe...
-
du kannst das array nicht "aufrufen". Ich nehme mal an du willst es einer Funktion übergeben, die ein Array als Argument erwartet (bzw. einen Pointer auf das erste Element eines Arrays, das ist das selbe).
Dass du es in einer Klasseverwenden willst hast du bisher z.B. noch nicht erwähnt.
Du hast etwas von einer Initliste geschrieben, was sich wiederum mit static beißt, denn statische Variablen werden nicht in Konstruktoren initialisiert. Alles etwas wirr also. Den relevanten Code den du bisher hast und die Fehlermeldungen die kommen hast du uns auch nicht geliefert.Als statisches Member ist das schnell geregelt:
//X.h class X { static GLfloat mColorRed[3]; //ggf. auch const }; //X.cpp #include "X.h" GLFloat X::mColorRed[3] = {23.5f, 12.77f, 38.123f}Mein Tip: nächstemal gleich alle relevanten Informationen zu Anfang:
- was willst du erreichen
- welche Idee hast du, um das umzusetzen
- zeig uns minimalen Code, der compiliert, dein Problem enthält, aber nichts überflüssiges
- zeig uns gleich die Fehlermeldung die dein Compiler ausspuckt.Und informiere dich über die Sprachwerkzeuge die du verwenden willst im Buch und/oder Tutorial deiner Wahl. Gerade bei so etwas Grundlegendem wie statischen Membern. Dass du was mit Initlisten versucht hast zeigt dass du dich nicht so recht informiert hast.
Das soll dich nicht verschrecken, die Sache ist nur folgende:
Jeder hier hilft gerne, wenn es um ein schwieriges oder interessantes Problem geht. Auf der anderen Seite ist hier niemand besonders erfreut wenn die Hilfestellung wegen fehlenden Infos zum Ratespiel wird oder wenn um Nachhilfe bei Grundlagen gebeten wird, die in jedem Buch stehen.
In diesem Sinne: viel Spaß beim Lernen und bis zum nächsten Mal wenn du ein wirkliches Problem hast

-
sdfsdf schrieb:
Tut mir Leid ich weiß nicht was du von mir willst!
Es weiß auch keiner was du willst.

Vielleicht sowas:
Header:
class foo { static int myInts[99]; // ... };Implementierung:
int foo::myInts[99] = { 1, 2, 4, 5 }; //...Wenn das Array Objekte enthält, dann eben, was weiß ich, vielleicht so:
Header:class foo { static GLfloat myGLfloat[99]; // ... };Implementierung:
GLfloat foo::myGLfloat[99] = { GLfloat(9.9), GLfloat(7.7) //... oder was auch immer GLfloat() akzeptiert };
-
@pumuckle
Raser!! 
-
Danke danke!
Der Fehler lag daran, dass ich Klasse:: vergessen habe! Peinlich.