C++ 有没有办法模拟 child 和 parent 类 之间的联合行为?
C++ Is there a way how to simulate union behavior between child and parent classes?
有没有办法模拟联合行为?见以下代码:
// this is ideal interface, which I would like to simulate
struct IdealInterface{
union{
struct{float r,g,b;};
struct{float x,y,z;};
};
};
// this is real parent object I should not change
struct Parent{
float r, g, b;
};
// this interface has ok behavior,
// but sizeof(Child0) != sizeof(Parent)
// which causes problems
struct Child0:public Parent{
float & x, & y, & z;
Child0() : Parent(), x(r), y(g), z(b){ };
};
// this has ok size, but interface is different
struct Child1:public Parent{
float & x(){ return r; }
float & y(){ return g; }
float & z(){ return b; }
};
因此,如上所述,我应该保留 Parent class,并且我应该从 Parent 派生出我的 child class。我不应该创建不同的类型并使用类型转换。因此,是否可以创建与 IdealInterface class 具有相同接口的派生 class(形式 Parent)?
如果您指的是与 union
相同的行为,那么不,不是没有实际使用 union
。
您总是可以隐藏底层数据:
class Vertex
{
Vertex();
Vertex(float,float,float);
float& x() { return r;}
float& y() { return g;}
float& z() { return b;}
float& r() { return r;}
float& g() { return g;}
float& b() { return b;}
void r(float rComponent) { this->r = rComponent; }
...
private:
float r, g, b;
}
但是,这种方法的缺点是您必须调用方法,而不是像使用联合那样访问基础变量。
如果你想:
Vertex v;
v.x = 1.0f
那么你会想要使用联合。
答案:
首先,我想对评论员说几句话。我问了一个非常直截了当的问题。我得到了什么?例如关于 sizeof 属性的答案,这些属性没有被提出(顺便说一句,是的,在这种情况下我保证关于 sizeof - 这是 c++,不是今天常见的狂野语言)。
为什么我不能使用IdealInterface。问题比较复杂。我想使用引入的约束和依赖项来编辑更大的代码包。因此这就是问题,我无法重新定义问题,但它意味着更简单的解决方案。
回答:否,不可能。
为什么?它基于匿名结构和联合的属性。
最近的方法:为了我的目的,最近的方法是使用内存模型作为参数。
struct BASIC_MEMORY_MODEL{
float x, y, z;
BASIC_MEMORY_MODEL() :x(), y(), z(){}
};
struct ADVANCED_MEMORY_MODEL{
union{
struct { float x, y, z; };
struct { float r, g, b; };
};
ADVANCED_MEMORY_MODEL() :x(), y(), z(){}
};
template<typename MEMORY_MODEL = BASIC_MEMORY_MODEL>
struct ParentBase : public MEMORY_MODEL{};
typedef ParentBase<> Parent;
struct Child : public ParentBase < ADVANCED_MEMORY_MODEL > {};
有没有办法模拟联合行为?见以下代码:
// this is ideal interface, which I would like to simulate
struct IdealInterface{
union{
struct{float r,g,b;};
struct{float x,y,z;};
};
};
// this is real parent object I should not change
struct Parent{
float r, g, b;
};
// this interface has ok behavior,
// but sizeof(Child0) != sizeof(Parent)
// which causes problems
struct Child0:public Parent{
float & x, & y, & z;
Child0() : Parent(), x(r), y(g), z(b){ };
};
// this has ok size, but interface is different
struct Child1:public Parent{
float & x(){ return r; }
float & y(){ return g; }
float & z(){ return b; }
};
因此,如上所述,我应该保留 Parent class,并且我应该从 Parent 派生出我的 child class。我不应该创建不同的类型并使用类型转换。因此,是否可以创建与 IdealInterface class 具有相同接口的派生 class(形式 Parent)?
如果您指的是与 union
相同的行为,那么不,不是没有实际使用 union
。
您总是可以隐藏底层数据:
class Vertex
{
Vertex();
Vertex(float,float,float);
float& x() { return r;}
float& y() { return g;}
float& z() { return b;}
float& r() { return r;}
float& g() { return g;}
float& b() { return b;}
void r(float rComponent) { this->r = rComponent; }
...
private:
float r, g, b;
}
但是,这种方法的缺点是您必须调用方法,而不是像使用联合那样访问基础变量。
如果你想:
Vertex v;
v.x = 1.0f
那么你会想要使用联合。
答案:
首先,我想对评论员说几句话。我问了一个非常直截了当的问题。我得到了什么?例如关于 sizeof 属性的答案,这些属性没有被提出(顺便说一句,是的,在这种情况下我保证关于 sizeof - 这是 c++,不是今天常见的狂野语言)。
为什么我不能使用IdealInterface。问题比较复杂。我想使用引入的约束和依赖项来编辑更大的代码包。因此这就是问题,我无法重新定义问题,但它意味着更简单的解决方案。
回答:否,不可能。
为什么?它基于匿名结构和联合的属性。
最近的方法:为了我的目的,最近的方法是使用内存模型作为参数。
struct BASIC_MEMORY_MODEL{
float x, y, z;
BASIC_MEMORY_MODEL() :x(), y(), z(){}
};
struct ADVANCED_MEMORY_MODEL{
union{
struct { float x, y, z; };
struct { float r, g, b; };
};
ADVANCED_MEMORY_MODEL() :x(), y(), z(){}
};
template<typename MEMORY_MODEL = BASIC_MEMORY_MODEL>
struct ParentBase : public MEMORY_MODEL{};
typedef ParentBase<> Parent;
struct Child : public ParentBase < ADVANCED_MEMORY_MODEL > {};