Static Array in Header


  • Administrator

    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.


Anmelden zum Antworten