C++ 结构中指针的动态数量

C++ 结构中指针的动态数量,c++,dynamic,struct,C++,Dynamic,Struct,朋友 我有一个包含指针的结构。不同的指针将连接到不同的数据类型。问题是,我不知道当前结构将连接到多少个,这些数据结构将是什么 比如说, struct root { branch1 *a; branch2 *b; branch3 *c; /// ... }; 分支1、2、3本身是不同的结构。但我现在不知道我将把根连接到多少个分支1、2、3。因此,如果稍后我知道根将连接到多少个,是否有一种方法可以动态地向结构中引入额外的指针 让我更具体一点。 根是不同逻辑门之间的导线。 分支1、2

朋友

我有一个包含指针的结构。不同的指针将连接到不同的数据类型。问题是,我不知道当前结构将连接到多少个,这些数据结构将是什么

比如说,

struct root
{
  branch1 *a;
  branch2 *b;
  branch3 *c;
  /// ...
};
分支1、2、3本身是不同的结构。但我现在不知道我将把根连接到多少个分支1、2、3。因此,如果稍后我知道根将连接到多少个,是否有一种方法可以动态地向结构中引入额外的指针

让我更具体一点。 根是不同逻辑门之间的导线。 分支1、2、3实际上指向由该导线驱动的栅极。 因为有不同的门(不同的输入数量,不同的功能),我不知道现在的线路扇出是什么

---------------我目前的做法----------------------------------

在我讨论一些朋友建议的一些成熟的数据结构之前,比如vector

目前我正在尝试使用一些固有的类和多态性来实现

所有导线都是基础导线固有的,但具有不同的扇出

所有的门都是从具有最大数量输入的基本门中固有的,固有门使用其中的一些门来实现门功能


我还在努力

创建一个名为Branch的类。使所有其他类都从Branch1、Branch2等分支派生

在结构中,创建指向分支的指针数组或向量,如下所示:

struct root{

    vector<branch *>branches;

...... };
struct root{
矢量分支;
...... };

创建一个名为Branch的类。使所有其他类都从Branch1、Branch2等分支派生

在结构中,创建指向分支的指针数组或向量,如下所示:

struct root{

    vector<branch *>branches;

...... };
struct root{
矢量分支;
...... };

您始终可以使用继承和向量

范例

struct Branch{

}

struct Branch1 : public Branch{

}

struct root{

  vector<branch*> branches;
};
struct分支{
}
结构Branch1:公共分支{
}
结构根{
向量分支;
};

您可以始终使用继承和向量

范例

struct Branch{

}

struct Branch1 : public Branch{

}

struct root{

  vector<branch*> branches;
};
struct分支{
}
结构Branch1:公共分支{
}
结构根{
向量分支;
};
看看这个 它可以归结为,例如,
std::vector

看看这个
它可以归结为例如:代码> STD::vector < /COD>

< P>您应该使用一个基类(或者java术语的接口)来为所有不同的分支类型存储指针,并将指针存储在一个可以动态增长的数据结构中(C++中的列表或向量更简单)。
类基本分支
{
...
};
类别Branch1:公共基础分支
{
...
};
使用名称空间std;
ListmyBranchs;
如果需要按位置访问元素,而不是总是从列表的第一个元素开始,我建议使用std::vector

using namespace std;
vector<BaseBranch*>mybranches;
使用名称空间std;
媒介分支;

<>编辑:固定一个类型-感谢Linuxios

< P>你应该使用一个基类(或者java术语的接口)来为你所有不同的分支类型存储指针,并将指针存储在一个可以动态增长的数据结构中(C++中的列表或向量更简单)。
类基本分支
{
...
};
类别Branch1:公共基础分支
{
...
};
使用名称空间std;
ListmyBranchs;
如果需要按位置访问元素,而不是总是从列表的第一个元素开始,我建议使用std::vector

using namespace std;
vector<BaseBranch*>mybranches;
使用名称空间std;
媒介分支;

编辑:修复了一个输入错误-多亏了Linuxios

这里有一些关于为什么需要继承解决方案的更详细解释:

  • C++代码生成ASM代码具有大量的编译时间偏移,类似于从内存中查找C++程序中的数据的常量。
  • C++有一个重要的特性,称为sizeof(T)。每种类型都支持它,它记录C++类型的行为。它的返回值是编译时常量,在运行时不能更改
  • sizeof(root)显然具有相同的限制。与结构类似,每个C++类型的行为方式相同。
  • 要想突破这一限制,唯一的办法是通过新的数组版本。它经过C++类型系统,结果是指针,而不是包含所有数据的类型。
  • vector通过保留两个独立的内存区域在内部解决了这个问题。再次,实际数据不在C++类型内。
  • 因此,处理运行时可变数据量的唯一方法是在运行时从一种类型跳到另一种类型。如果你只有一种类型,那就不够了
  • 带有基类和虚拟函数的继承解决方案是一种从一种类型跳到另一种类型的方法。还有其他方法可以做同样的跳跃

  • 下面更详细地解释了为什么需要继承解决方案:

  • C++代码生成ASM代码具有大量的编译时间偏移,类似于从内存中查找C++程序中的数据的常量。
  • C++有一个重要的特性,称为sizeof(T)。每种类型都支持它,它记录C++类型的行为。它的返回值是编译时常量,在运行时不能更改
  • sizeof(root)显然具有相同的限制。与结构类似,每个C++类型的行为方式相同。
  • 要想突破这一限制,唯一的办法是通过新的数组版本。它经过C++类型系统,结果是指针,而不是包含所有数据的类型。
  • vector通过保留两个独立的内存区域在内部解决了这个问题。再次,实际数据不在C++类型内。
  • 因此,处理运行时可变数据量的唯一方法是在运行时从一种类型跳到另一种类型。如果你只有一种类型,那就不够了
  • 带有基类和虚拟函数的继承解决方案是一种从一种类型跳到另一种类型的方法。还有其他方法可以做同样的跳跃

  • 你能详细介绍一下这个数据结构吗