C++映射变量地址?
我有这门课:C++映射变量地址?,c++,C++,我有这门课: class Texture { public: //I need this variable in this format float diffuseColor[3]; } 但我想制作一个比处理diffuseColor[0]等更简单的界面,比如: myTexture.color.r = 1.0f; //this is diffuseColor[0] class Color { public: float *r, *
class Texture
{
public:
//I need this variable in this format
float diffuseColor[3];
}
但我想制作一个比处理diffuseColor[0]等更简单的界面,比如:
myTexture.color.r = 1.0f; //this is diffuseColor[0]
class Color
{
public:
float *r, *g, *b;
}
因此,我试图获得一个类,该类作为diffuseColor值的外壳,类似于:
myTexture.color.r = 1.0f; //this is diffuseColor[0]
class Color
{
public:
float *r, *g, *b;
}
在我的纹理课上:
class Texture
{
public:
Texture()
{
color.r = &diffuseColor[0];
color.g = &diffuseColor[1];
color.b = &diffuseColor[2];
}
Color color;
private:
float diffuseColor[3];
}
但现在的情况是,如果我想使用颜色值,我必须取消对它们的引用:
(*myTexture.color.r) = 1.0f;
如何实现这一点而不必每次使用时都取消引用它?也许您可以使用C++的联合语言功能:
union ColorUnion {
// first representation (Texture)
struct TextureColor {
float diffuseColor[3];
}
// second representation (RGB)
struct RGBColor {
float r;
float g;
float b;
}
};
也许您可以使用C++的联合语言功能:
union ColorUnion {
// first representation (Texture)
struct TextureColor {
float diffuseColor[3];
}
// second representation (RGB)
struct RGBColor {
float r;
float g;
float b;
}
};
您可以使用将在成员初始值设定项列表中初始化的引用:
struct Color {
Color(float* colors): r(colors[0]), g(colors[1]), b(colors[2]) {}
float& r;
float& g;
float& b;
};
class Texture {
float diffuseColor[3];
public:
Color color;
Texture(): diffuseColor(), color(this->diffuseColor) {}
};
如果需要复制和/或指定纹理对象,还需要实现复制构造函数和指定操作符。还请注意,这种便利性的成本相对较高:指针和参考方法都会将纹理对象的大小增加3个指针。您最好使用访问器,例如:
class Texture {
float diffuseColor[3];
public:
float& r() { return this->diffuseColor[0]; }
float& g() { return this->diffuseColor[1]; }
float& b() { return this->diffuseColor[2]; }
};
您可以使用将在成员初始值设定项列表中初始化的引用:
struct Color {
Color(float* colors): r(colors[0]), g(colors[1]), b(colors[2]) {}
float& r;
float& g;
float& b;
};
class Texture {
float diffuseColor[3];
public:
Color color;
Texture(): diffuseColor(), color(this->diffuseColor) {}
};
如果需要复制和/或指定纹理对象,还需要实现复制构造函数和指定操作符。还请注意,这种便利性的成本相对较高:指针和参考方法都会将纹理对象的大小增加3个指针。您最好使用访问器,例如:
class Texture {
float diffuseColor[3];
public:
float& r() { return this->diffuseColor[0]; }
float& g() { return this->diffuseColor[1]; }
float& b() { return this->diffuseColor[2]; }
};
使用引用而不是指针。并将引用的初始化移到颜色构造函数中,而不是纹理中。或者,您可以只使用访问器函数,例如r/rfloat作为getter/setter,并去掉Color子类。@syam:引用而不是指针不允许复制。@MooingDuck啊,对了,没想到这一点,我的错,我几乎总是使用访问器处理这类内容,它们更干净。使用引用而不是指针。并将引用的初始化移到颜色构造函数中,而不是纹理中。或者您可以使用访问器函数,例如r/rfloat作为getter/setter,并去掉Color子类。@syam:引用而不是指针不允许复制。@MooingDuck啊,对了,没想到这一点,糟糕的是,我几乎总是使用访问器处理这类事情,它们比IMHO干净得多。请注意,您不能通过写入命名值来写入diffuseColor元素,反之亦然!联合一次只存储一个类型,访问另一个类型是未定义的行为,除非您访问两个类型的共同前缀的成员。@DietmarKühl:我认为对于成员相同的类型,该规则有所放宽。可能这只是通过指针或其他方式访问它们。9.5/1如果标准布局联合包含多个共享公共初始序列9.2的标准布局结构,并且如果此标准布局联合类型的对象包含一个标准布局结构,允许检查任何标准布局结构构件的公共初始顺序;见9.2-[结束语]looking@MooingDuck:是的,有一个放松:当类型有一个公共前缀时,例如联合{struct{int a;int b;float c;}s0;struct{int a;int b;double c;}s1;};:您可以访问s0.a或s1.a。但是,我认为数组和命名成员的布局不兼容;搜索子句。@MooingDuck:它是9.2[class.mem]第16段:如果两个标准布局结构子句9类型具有相同数量的非静态数据成员,并且声明顺序中相应的非静态数据成员具有布局兼容类型3.9,则它们是布局兼容的。现在的问题是,如果一个由三个浮点数组成的数组在一个结构中算作三个数据成员,但我不这么认为。请注意,不能通过写入命名值来写入diffuseColor元素,反之亦然!联合一次只存储一个类型,访问另一个类型是未定义的行为,除非您访问两个类型的共同前缀的成员。@DietmarKühl:我认为对于成员相同的类型,该规则有所放宽。可能这只是通过指针或其他方式访问它们。9.5/1如果标准布局联合包含多个共享公共初始序列9.2的标准布局结构,并且如果此标准布局联合类型的对象包含一个标准布局结构,允许检查任何标准布局结构构件的公共初始顺序;见9.2-[结束语]looking@MooingDuck:是的,有一个放松:当类型有一个公共前缀时,例如联合{struct{int a;int b;float c;}s0;struct{int a;int b;double c;}s1;};:您可以访问s0.a或s1.a。但是,我认为数组和命名成员的布局不兼容;搜索子句。@MooingDuck:它是9.2[class.mem]第16段:两种标准布局结构子句9类型在以下情况下是布局兼容的
它们具有相同数量的非静态数据成员,并且声明顺序中相应的非静态数据成员具有布局兼容类型3.9。现在的问题是,如果一个由三个浮点数组成的数组在一个结构中算作三个数据成员,但我不这么认为。我对纹理构造函数一点都不了解,但它正在工作。。。我有新东西要研究!我一点也不懂纹理构造器,但它正在工作。。。我有新东西要研究!