Advertisement

typedef, structs, and arrays

Started by January 30, 2014 07:10 AM
2 comments, last by alvaro 11 years ago

Hello, I have a struct that defines an RGBA colour:


struct Colour{
	float r; 
	float g;
	float b;
	float a;
};

Then I have an array of some predefined colours so instead of having to write out something link display.clear(Colour(1.f, 0.f, 0.f, 1.f) I would instead write display.clear(clr::red); So I have an array of colours:


//pre defined colours 
Colour colours[6] = {{1.f, 0.f, 0.f, 1.f},
					 {1.f, 0.f, 0.f, 1.f},
					 {1.f, 0.f, 0.f, 1.f},
					 {1.f, 0.f, 0.f, 1.f},
					 {1.f, 0.f, 0.f, 1.f},
					 {1.f, 0.f, 0.f, 1.f}};

Now here is my problem. I want to typedef all the elements in the array so instated of writing clr::colours[0] I write clr::red. SO I tried writing them like this and it did not work:


namespace clr{
	typedef colours[0] red;
	typedef colours[1] green;
	typedef colours[2] blue;
	typedef colours[3] magenta;
	typedef colours[4] white;
	typedef colours[5] black;
}//namespace clr

Is this possible or did I just do it wrong? Thanks for any help.

You don't want a typedef (an alias of a type), but a constant (an "alias", so to speak, of a value).


namespace clr
{
     const Colour red = colours[0];
     const Colour green = colours[1];
}


Though, I don't recall whether 'colours[1]' is garunteed to be initialized before 'green' is (might be undefined behavior), so it'd probably be better (and clearer in the code) to do it the other way around:


namespace clr
{
     const Colour red = {1.f, 0.f, 0.f, 1.f};
     const Colour green = {0.f, 1.f, 0.f, 1.f};
 
     //pre defined colours 
     Colour colours[6] = {red,
                          green,
                          etc...};
}
Advertisement

Thanks, I didn't even think of that.

Though, I don't recall whether 'colours[1]' is garunteed to be initialized before 'green' is (might be undefined behavior), so it'd probably be better (and clearer in the code) to do it the other way around:


Unless you initialize them in different translation units, it should be just fine. I still prefer the other method, or this variation of it:
struct Colour{
  float r, g, b, a;
  
  Colour(float r, float g, float b, float a) : r(r), g(g), b(b), a(a) {
  }
};

namespace clr {
  const Colour red(1.f, 0.f, 0.f, 1.f);
  const Colour green(0.f, 1.f, 0.f, 1.f);
  
  //pre defined colours 
  Colour colours[6] = {red,
                       green,
                       etc...};
}

This topic is closed to new replies.

Advertisement