我目前正在使用一个 C 程序,该程序使用由 xyz 坐标组成的结构,但有时这些坐标可能指的是 vector (力/速度类型,而不是数据结构),而在其他时候它可能指的是位置。我知道可以针对所有这些不同的条件简单地使用一个结构,因为它们都使用大部分相同的数据类型( float ),但只是为了让我的数学更好地组织(加上变量和结构名称)并防止混淆,有没有一种方法可以定义一个基本结构,该结构将自身定义为具有三个 float ,由另一个结构继承,该结构更具体地定义了该结构应该是什么(例如位置而不是速度等)?我知道 C 不是 OOP,但似乎可以这样做这是基本结构的样子:
struct ThreeDCartesianData
{
float x;
float y;
float z;
};
一个更具体的结构将从它继承并可能定义额外的变量,或者为变量使用不同的名称。将使用多个位置结构,但我认为每组数据只使用一个速度结构。我看过类似的问题,但他们似乎都指的是更高级的语言(C++、C#等)
最佳答案
您可以为此使用union
。您的主要 struct
将包含“派生”结构的 union
以及告诉您 union 的哪个成员有效的“标志”字段:
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;
如果 union 中的所有结构都具有相同类型且顺序相同的初始列表元素,则该标准允许您从任何子结构安全地访问这些字段。
关于c - 是否有可能从抽象/基本结构继承或在 C 中沿着这些线路模拟某些东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777451/