Phl*_*ous 2 c++ inheritance unions
我有一个简单的观点struct,我想继承:
struct PointXYZ
{
double x, y, z;
};
class extendedPoint : public PointXYZ
{
public:
double getXYZ(int i);
void setXYZ(int i, double value);
private:
int moreproperties;
};
Run Code Online (Sandbox Code Playgroud)
get-set函数被索引,因为我希望能够循环获取和设置xyz值.我想通过修改,如回答描述了我的基类索引XYZ和独立的X,Y,Z的概念链接这篇文章:
struct PointXYZ
{
union {
struct {
double x, y, z;
};
double xyz[3];
};
};
class extendedPoint : public PointXYZ
{
public:
double getXYZ(int i) { return xyz[i]; }
void setXYZ(int i, double value) { xyz[i] = value; }
private:
int moreproperties;
};
Run Code Online (Sandbox Code Playgroud)
但这篇文章直接与第一篇文章相矛盾:以下内容是否有效:
double dostuff()
{
PointXYZ p;
p.x = 123.88;
return p.xyz[0];
}
Run Code Online (Sandbox Code Playgroud)
那么,是否PointXYZ使用了union有效的c ++并且编译器之间是否一致?
从标准:
在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.[注意:为了简化联合的使用,我们做了一个特别的保证:如果标准布局联合包含几个共享公共初始序列(9.2)的标准布局结构,并且这个标准布局联合类型的对象包含一个标准布局结构,允许检查任何标准布局结构成员的公共初始序列; 见9.2. - 结束说明]
在我看来,特殊保证表明了这一点
struct PointXYZ {
union {
struct {
double xyz[3];
};
struct {
double x, y, z;
};
};
};
Run Code Online (Sandbox Code Playgroud)
阅读不是最后写的成员时应该工作得很好(看到它发生).
但请注意,根据规格,你的例子
struct PointXYZ {
union {
struct {
double xyz[3];
};
double x, y, z;
};
};
Run Code Online (Sandbox Code Playgroud)
读取未写入的成员时是未定义的行为(看到它发生).设置xyz[0],xyz[1]和xyz[2],全部x,y并且z具有与xyz[0]链接示例中相同的值.我希望大多数编译器都表现得像这样,但标准并不保证.
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |