Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++映射变量地址?_C++ - Fatal编程技术网

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。现在的问题是,如果一个由三个浮点数组成的数组在一个结构中算作三个数据成员,但我不这么认为。我对纹理构造函数一点都不了解,但它正在工作。。。我有新东西要研究!我一点也不懂纹理构造器,但它正在工作。。。我有新东西要研究!