Toon posts:

[C++] Klasse met static const's, zoals in Java

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb wat ervaring met Java en moet nu een project doen in C++. Ik heb verschillende klasses gemaakt, een aantal hiervan hebben een GLfloat[4] nodig dat een kleur voorstelt. Nou leek het me wel leuk om net als ik in Java zou doen, een klasse Color te maken, met daarin een aantal constanten, die ik door het hele project kan gebruiken. Dus heb ik Colors.h gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef COLORS_H_
#define COLORS_H_

#include "/usr/include/GL/gl.h"

namespace std {

    class Colors {
        public:
            static const GLfloat RED[4];
    };
}

#endif /*COLORS_H_*/


en Colors.cpp:
code:
1
2
3
4
5
#include "Colors.h"

namespace std {
    static const GLfloat RED[4] = { 1.0, 0.0, 0.0, 1.0 };   
}


Maar hoe gebruik ik dat dan in de andere klassen? Ik include Colors.h daar, en wil dan Colors::RED gebruiken als constante, maar dan krijg ik de melding "undefined reference to `std::Colors::RED'". Wat is er nou mis, of hoe zou ik 't anders moeten doen in C++?

  • JeromeB
  • Registratie: September 2003
  • Laatst online: 15-11 14:27

JeromeB

woei

Ik zou zoiets doen:
C++:
1
2
std::map<std::string,GLfloat[4]> colormap;
colormap["red"] = {1.0, 0.0, 0.0, 1.0};


Bovendien mag je niet zomaar in de std-namespace zitten klooien (er waren wel wat uitzonderingen mbt Templates, maar die weet ik zo niet uit mijn hoofd). Wat er precies mis is met je static-zooi zou ik niet weten, ik gebruik nooit static.

PC load letter? What the fuck does that mean?


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

De reden van de link error is dat je in de header std::Colors::RED declareert, terwijl je in de sourcefile std::RED definieert.

JeromeB: ik hoop dat dat pseudocode is want beide regels kloppen niet ;)

[ Voor 25% gewijzigd door .oisyn op 19-11-2006 02:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JeromeB
  • Registratie: September 2003
  • Laatst online: 15-11 14:27

JeromeB

woei

.oisyn, ik had het niet getest, ik werk eigenlijk nooit direct met arrays. Waarom klopt/werkt het niet?

edit:
Ik denk dat ik hem snap, het volgende kan om diezelfde reden ook niet:
code:
1
2
float bla[4] = {1.0, 0.0, 0.0, 1.0};
float bla2[4] = bla;


Overigens kan hij natuurlijk ook zijn eigen color-type maken ipv die GLfloat[4].

[ Voor 54% gewijzigd door JeromeB op 19-11-2006 02:53 ]

PC load letter? What the fuck does that mean?


  • B-Man
  • Registratie: Februari 2000
  • Niet online
JeromeB schreef op zondag 19 november 2006 @ 02:41:
.oisyn, ik had het niet getest, ik werk eigenlijk nooit direct met arrays. Waarom klopt/werkt het niet?

edit:
Ik denk dat ik hem snap, het volgende kan om diezelfde reden ook niet:
code:
1
2
float bla[4] = {1.0, 0.0, 0.0, 1.0};
float bla2[4] = bla;


Overigens kan hij natuurlijk ook zijn eigen color-type ipv die GLfloat[4].
Mijn C++ is wat stoffig, maar ik vermoed dat het er (in psuedocode) om gaat dat je in je sourcefile een std::RED definieert, ipv std::Colors::RED.

Colors.cpp:
C++:
1
2
3
4
5
#include "Colors.h"

namespace std {
    static const GLfloat Colors::RED[4] = { 1.0, 0.0, 0.0, 1.0 };    
}


Verder zou ik, net als jeromeB, niet met een array werken, maar met een C++ klasse als map.

offtopic:
De java 1.5 enums zijn echt schitterend als ik zoiets als dit weer zie!

Verwijderd

Topicstarter
Inderdaad, het was Colors::RED. Als ik een kwartje kreeg voor iedere keer dat ik dat inmiddels fout heb gedaan .. en dan toch weer opnieuw 8)7

Ik ga nog 's kijken naar die map. En inderdaad .. java enums :P

Tnx!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

JeromeB schreef op zondag 19 november 2006 @ 02:41:
.oisyn, ik had het niet getest, ik werk eigenlijk nooit direct met arrays. Waarom klopt/werkt het niet?

edit:
Ik denk dat ik hem snap, het volgende kan om diezelfde reden ook niet:
code:
1
2
float bla[4] = {1.0, 0.0, 0.0, 1.0};
float bla2[4] = bla;
Dat idd, en omdat dit ook niet kan:
C++:
1
2
3
int bla[4];
// doe iets
bla = { 1, 2, 3, 4 };

De assignment in jouw regel 2 gaat dus ook niet werken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JeromeB
  • Registratie: September 2003
  • Laatst online: 15-11 14:27

JeromeB

woei

Je zou ook zoiets kunnen doen, maar ik vind de std::map persoonlijk toch handiger:

C++:
1
2
3
4
5
6
7
8
9
10
11
void add_color(float map[4], float a, float b, float c, float d)
{
    map[0] = a;
    map[1] = b;
    map[2] = c;
    map[3] = d;
}

enum color{ RED, GREEN, BLUE, etc };
float colormap[4][4];
add_color(colormap[RED],1.0,0.0,0.0,1.0);


-------------------

Damn, ik moet het werken met arrays in C++ weer helemaal opnieuw leren ;(

PC load letter? What the fuck does that mean?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Dat kan ook wel als een constant ding:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
enum E_COLORS
{
    RED = 0,
    GREEN = 1,
    BLUE=3
};

struct ColorEnum
{
    E_COLORS    Color;
    float       Value[3];
};

class Colors
{
public:
    const static ColorEnum RGB[ 3 ];
};

const ColorEnum Colors::RGB[3] = 
{
    { RED, { 255.0f, 0.0f, 0.0f } },
    { GREEN, { 0.0f, 255.0f, 0.0f } },
    { BLUE, { 0.0f, 0.0f, 255.0f } }
};

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1