2017-09-18 9 views
-1

関数ポインタ(vTable)の配列を持つ構造体をCで宣言する際に問題があります。なぜなら関数ポインタを先に宣言すればであり、パラメータは自己参照型のthisポインタであるです。構造体はまだ宣言されていません。私は構造体AFTER関数ポインタを宣言すると、関数型が宣言されていないコンパイラは文句ので、私は構造体に設定する場合、次のようになります。CでvTableまたは関数ポインタの配列を使用して構造体を作成するにはどうすればよいですか?

#include <stdio.h> 
#include <stdlib.h> 
typedef int (*math_operation) (struct _MyClass *this,int a, int b); 
typedef struct _MyClass{ 
    int number; 
    char name[50]; 
    math_operation *vTable[50]; 
} MyClass; 
int main(void) 
{ 
    MyClass *test; 
    return(EXIT_SUCCESS); 
} 

をどの関数ポインタの配列を作成する適切な方法は何ですか親構造体への "this"ポインタを持っていますか?

答えて

4

あなただけのグローバル名前空間における構造体の前方宣言が必要です。私は、タグの識別子を固定し、それがC standardを踏まないであろう

  1. :注意すべき

    struct MyClass_; 
    typedef int math_operation(struct MyClass_ *this, int a, int b); 
    
    typedef struct MyClass_{ 
        int number; 
        char name[50]; 
        math_operation *vTable[50]; 
    } MyClass; 
    

    物事を。

  2. ポインタ typedefを関数タイプ typedefに変更しました。 math_operationへのポインタの配列として既にvTableを定義しています。 1つのポインタ宣言子は不必要でした。これはまた、あなたが本来の目的で関数を宣言することを可能にする素敵な有用性を持っており、コンパイラ型はそれをチェックします:

    math_operation add; 
    
    // .. Later 
    
    int add(struct MyClass_ *this, int a, int b) { 
        return a + b; 
    } 
    
関連する問題