0

友達

ポインタを含む構造体があります。さまざまなポインタがさまざまなデータ型に接続します。問題は、現在の構造体がいくつ接続するのか、それらのデータ構造がどうなるのかわからないことです。

例えば、

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

Branch1、2、3はそれ自体が異なる構造体です。しかし、今のところ、ルートを接続するブランチ1、2、3の数はわかりません。したがって、後でルートがいくつ接続するかがわかっている場合に、構造体に追加のポインターを動的に導入する方法はありますか?

具体的に説明します。ルートは、異なる論理ゲート間のワイヤです。branch1、2、3は、実際にはこのワイヤによって駆動されるゲートを指しています。ゲートが異なり(入力の数が異なり、機能が異なる)、ワイヤーのファンアウトが何であるかがわかりません。

---------------私の現在のアプローチ-------------------------------- -

何人かの友人によって提案されたように、ベクトルのような成熟したデータ構造に行く前に、

現在、私はいくつかの固有のクラスとポリモーフィズムを使用して実装しようとしています。

すべてのワイヤはベースワイヤに固有ですが、ファンアウトが異なります

すべてのゲートは、入力数が最も多いベースゲートに固有のものであり、固有のゲートは、それらの一部を使用してゲート機能を実装します。

まだ試しています。

4

5 に答える 5

3

これを見て くださいhttp://www.parashift.com/c++-faq/heterogeneous-list.htmlstd::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から派生させます。

構造体で、次のように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 は、2 つの別個のメモリ領域を保持することで内部的に問題を解決します。繰り返しますが、実際のデータは c++ 型内にはありません。
  6. そのため、実行時に可変量のデータを処理する唯一の方法は、実行時にある型から別の型にジャンプすることです。1種類だと物足りない。
  7. 基本クラスと場合によっては仮想関数を使用した継承ソリューションは、ある型から別の型にジャンプする方法です。同じ種類のジャンプを行う別の方法があります。
于 2012-07-21T21:13:09.550 に答える