我目前正在使用一个使用由xyz坐标组成的结构的C程序,但有时这些坐标可能是指向量(力/速度类型,而不是数据结构),而在其他时候它可能指的是位置.我知道可以简单地使用一个结构来处
struct ThreeDCartesianData { float x; float y; float z; };
更具体的结构将从中继承并可能定义额外的变量,或者为变量使用不同的名称.将使用多个位置结构,但我认为每组数据只有一个速度结构.我已经看到了类似的问题,但它们似乎都指的是更高级别的语言(C,C#等等)
你可以使用联盟.你的主结构将包含“派生”结构的联合以及一个“标志”字段,告诉你哪个联合成员是有效的:enum { DERIVED11, DERIVED2, DERIVED3 }; struct derived1 { int x1; }; struct derived2 { char x2; }; struct derived3 { float x3; }; struct ThreeDCartesianData { float x; float y; float z; int derivedType; union { struct derived1 d1; struct derived2 d2; struct derived3 d3; } derived; };
然后你可以像这样使用它们:
struct ThreeDCartesianData data1; data1.x=0; data1.y=0; data1.z=0; data1.derivedType = DERIVED1; data1.derived.d1.x1 = 4;
你可以像这样定义它们:
struct common { int type; float x; float y; float z; }; struct derived1 { int type; float x; float y; float z; int x1; }; struct derived2 { int type; float x; float y; float z; char x2; }; struct derived3 { int type; float x; float y; float z; float x3; }; union ThreeDCartesianData { struct common c; struct derived1 d1; struct derived2 d2; struct derived3 d3; };
并像这样使用它们:
union ThreeDCartesianData data1; data1.c.type=DERIVED1; data1.d1.x=0; data1.d1.y=0; data1.d1.z=0; data1.d1.x1 = 4;
如果联合中的所有结构都具有相同顺序的相同类型的初始列表元素,则该标准允许您安全地从任何子结构访问这些字段.