0

朋友们

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

例如,

struct root
{
  branch1 *a;
  branch2 *b;
  branch3 *c;
  /// ...
};

Branch1、2、3 本身就是不同的结构。但我现在不知道我会将根连接到多少个分支 1、2、3。因此,如果以后我知道根将连接到多少个,有没有办法动态地将额外的指针引入结构?

让我更具体一点。根是不同逻辑门之间的连线。branch1, 2, 3 实际上指向由这条线驱动的门。由于有不同的门(不同数量的输入,不同的功能),我现在不知道线的扇出是什么。

---------------我目前的方法-------------------------------- --

在我按照一些朋友的建议去学习一些成熟的数据结构之前,比如vector,

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

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

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

我还在努力。

4

5 回答 5

3

看看这个http://www.parashift.com/c++-faq/heterogeneous-list.html 它归结为例如std::vector<boost::shared_ptr<BranchBase>>

于 2012-07-21T19:21:42.820 回答
1

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

例子

struct Branch{

}

struct Branch1 : public Branch{

}

struct root{

  vector<branch*> branches;
};

更多关于这里

于 2012-07-21T19:19:27.897 回答
0

创建一个名为 Branch 的类。使所有其他类从 Branch1、Branch2、..

在您的结构中,创建一个指向 Branch 的指针数组或向量,如下所示:

struct root{

    vector<branch *>branches;

...... };
于 2012-07-21T19:17:29.653 回答
0

相反,您应该为所有不同的分支类型使用基类(或 java 术语中的接口),并将指向该类的指针存储在可以动态增长的数据结构中(C++ STL 中的列表或向量更简单)。

class BaseBranch
{
...
};

class Branch1 : public BaseBranch
{
...
};

using namespace std;
list<BaseBranch*>mybranches;

如果您需要按位置访问元素而不是总是从列表的第一个元素开始,我建议使用 std::vector

using namespace std;
vector<BaseBranch*>mybranches;

编辑:修正了一个错字 - 感谢 Linuxios

于 2012-07-21T19:25:09.980 回答
0

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

  1. C++ 代码生成生成的 asm 代码具有大量编译时偏移量的常量,这些常量从内存中查找 c++ 程序中的数据。
  2. C++ 有一个重要的特性叫做 sizeof(T)。每种类型都支持它,并且它记录了 c++ 类型的行为。它的返回值是编译时常量,在运行时不能改变。
  3. sizeof(root) 显然有同样的限制。就像您的结构一样,每种 c++ 类型的行为方式都相同。
  4. 超越限制的唯一方法是通过 new 的数组版本。它超越了 c++ 类型系统,结果是一个指针,而不是包含所有数据的类型。
  5. std::vector 通过保留两个独立的内存区域在内部解决了这个问题。同样,实际数据不在 c++ 类型中。
  6. 因此,处理运行时可变数据量的唯一方法是在运行时从一种类型跳转到另一种类型。如果你只有一种类型,那是不够的。
  7. 具有基类和可能的虚函数的继承解决方案是一种从一种类型跳转到另一种类型的方法。还有其他方法可以进行相同的跳跃。
于 2012-07-21T21:13:09.550 回答