9

C でリンク リストを作成しようとしていますが、C++ スタイルのクラスにうまくパックしようとしています。私はいくつかの問題を抱えていますが、C で関数ポインタを使用しています。

typedef struct linkedList {
    int count;
    struct msgNode *front;
    struct msgNode *back;
    void (*addMSG)(unsigned char *, int, struct linkedList *);
} msgList;

void addMSG(unsigned char *data, int size, struct linkedList *self);

理想的には、リストを作成してから、構造内で「メソッド」(関数) を呼び出すだけで、C++ で見られる動作をシミュレートできるようにしたいと考えています。

現在、addMSG を呼び出すと、セグメンテーション エラーが発生します。これはもちろん、addMSG が関数を指していないためです。ただし、リンクされたリストを使用するたびにポイントする関数を指定する必要はありません。暗黙的に関数を指さなくても関数ポインターを持つ良い方法はありますか、それとも暗黙的に関数を指す必要がありますか?

これは、ここで示した部分的な実装にすぎません。最終的に、この構造体には必要な機能がすべて含まれます。これは、この質問を短く簡潔にするためです。

4

3 に答える 3

24

メンバーに関数を割り当てる必要があります。また、別の名前を付けることをお勧めします。

typedef void (*addMSGFunc)(unsigned char *, int, struct linkedList *);

typedef struct linkedList {
    int count;
    struct msgNode *front;
    struct msgNode *back;
    addMSGFunc addMSG;
} msgList;

void addMSGImpl(unsigned char *data, int size, struct linkedList *self)
{
    ...
}

そして、msgList を作成した後:

msgList myList;
myList.addMSG = addMSGImpl;
于 2013-09-26T21:31:25.923 に答える
3

構造体の宣言にデフォルト値を追加することはできませんが、できることは次のとおりです。

  • インスタンスを初期化する関数を作成しlinkedListます - C スタイル ライブラリで見たことがあると思います。
  • 既定のリスト アイテムを作成し、新しいエンティティを作成するときにそれを使用します。

お気に入り:

void addMSG(unsigned char *data, int size, struct linkedList *self);

struct linkedList {
    int count;
    struct msgNode *front;
    struct msgNode *back;
    void (*addMSG)(unsigned char *, int, struct linkedList *);
} DefaultList = {0, NULL, NULL, addMSG};
于 2013-09-26T21:33:19.380 に答える
1

実際に使用しない限り、初期化されていない関数ポインターを問題なく使用できます。関数を呼び出すためにそれを使用したい場合は、明らかに関数をそれに割り当てる必要があります。C は、使用する関数を推測できません。

関数が必要な場合と必要でない場合がある連結リスト構造がある場合はNULL、リストを作成するときにそれに代入し、そうでない場合にのみリストの実装で関数を呼び出すようにしますNULL

常に同じ関数を指している場合は、コンストラクター関数で代入を行うだけです。

于 2013-09-26T21:31:51.917 に答える