Neomi
2005-04-29, 13:24:12
Wenn ich eine Struktur in einer Union verwenden will, darf diese Struktur keinen Defaultkonstruktor haben, ich brauche eigentlich auch keinen Defaultkonstruktor. Da ich aber einen parametrisierten Konstruktor haben möchte, muß ich ebenfalls einen Defaultkonstruktor liefern, der zwar nichts tut, aber eben doch vorhanden ist. Ansonsten kann ich keine uninitialisierten Variablen des Typs anlegen.
Hier der konkrete Fall:
struct ColRGB
{
float r;
float g;
float b;
ColRGB () { }
ColRGB (float r, float g, float b)
{
this->r = r;
this->g = g;
this->b = b;
}
};
struct ColRGBA
{
union
{
ColRGB rgb;
struct
{
float r;
float g;
float b;
};
};
float a;
ColRGBA () { }
ColRGBA (float r, float g, float b, float a)
{
this->r = r;
this->g = g;
this->b = b;
this->a = a;
}
};
Leider funktioniert die Union dank des Defaultkonstruktors nicht und ein "const" ist leider bei Konstruktoren nicht erlaubt. Dabei will ich doch nur etwas in der Richtung nutzen können:
ColRGBA Color (0.0f, 0.0f, 0.0f, 1.0f);
Color.rgb = ColRGB (0.5f, 0.5f, 0.5f);
Ich habe es jetzt auf diese Art versucht:
struct ColRGBA
{
ColRGB rgb;
float & r;
float & g;
float & b;
float a;
ColRGBA () : r (rgb.r), g (rgb.g), b (rgb.b) { }
ColRGBA (float r, float g, float b, float a) : r (rgb.r), g (rgb.g), b (rgb.b)
{
this->r = r;
this->g = g;
this->b = b;
this->a = a;
}
};
Das funktioniert zwar, leider benötigt jede Referenz ihren eigenen Speicherplatz und die Struktur erreicht eine Größe von 28 statt 16 Bytes.
Kennt jemand vielleicht eine elegante Lösung, wie ich direkt auf r, g, b und a, aber auch auf rgb als Ganzes zugreifen kann, ohne daß die Struktur größer wird als 16 Bytes?
Hier der konkrete Fall:
struct ColRGB
{
float r;
float g;
float b;
ColRGB () { }
ColRGB (float r, float g, float b)
{
this->r = r;
this->g = g;
this->b = b;
}
};
struct ColRGBA
{
union
{
ColRGB rgb;
struct
{
float r;
float g;
float b;
};
};
float a;
ColRGBA () { }
ColRGBA (float r, float g, float b, float a)
{
this->r = r;
this->g = g;
this->b = b;
this->a = a;
}
};
Leider funktioniert die Union dank des Defaultkonstruktors nicht und ein "const" ist leider bei Konstruktoren nicht erlaubt. Dabei will ich doch nur etwas in der Richtung nutzen können:
ColRGBA Color (0.0f, 0.0f, 0.0f, 1.0f);
Color.rgb = ColRGB (0.5f, 0.5f, 0.5f);
Ich habe es jetzt auf diese Art versucht:
struct ColRGBA
{
ColRGB rgb;
float & r;
float & g;
float & b;
float a;
ColRGBA () : r (rgb.r), g (rgb.g), b (rgb.b) { }
ColRGBA (float r, float g, float b, float a) : r (rgb.r), g (rgb.g), b (rgb.b)
{
this->r = r;
this->g = g;
this->b = b;
this->a = a;
}
};
Das funktioniert zwar, leider benötigt jede Referenz ihren eigenen Speicherplatz und die Struktur erreicht eine Größe von 28 statt 16 Bytes.
Kennt jemand vielleicht eine elegante Lösung, wie ich direkt auf r, g, b und a, aber auch auf rgb als Ganzes zugreifen kann, ohne daß die Struktur größer wird als 16 Bytes?