c - 是否有可能从抽象/基本结构继承或在 C 中沿着这些线路模拟某些东西?

标签 c inheritance struct

我目前正在使用一个 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/

相关文章:

Cs50 Pset4。调整更多大小。不知道如何让它变小

go - 如何在Golang中的struct中访问嵌套字段

c++ - 从模板化父类中的派生内部类访问 protected 成员变量

C - 结构和函数的前向声明

c - MPI 结构错误

c - 关于代码片段中分配内存的差异的问题?

c++ - 我的 C/C++ 程序在运行后立即关闭。必须使用 ConsolePauser.exe 运行

c++ - C 链接 C++ 静态函数

javascript - 继承和模块模式

javascript - 如何在父类(super class)静态函数中引用子类的静态参数?