0

私は次のクラスを持っています

class msg{
//other stuffs before
        void (*callback)(void *);
    bool callback_check(const msg_type_e, void callback);
}

アイデアは基本的に、「callback_check」関数を呼び出して、「callback」がクライアントによって既に設定されているかどうかを確認することです。設定されている場合、callback_check は内部処理を行います。そのため、「callback」を「callback_check」関数のパラメーターとして渡すことを考えました。

しかし、コンパイルしようとすると、「コールバックの型が不完全です」と不平を言います。コールバックが設定されているかどうかを確認する最良の方法は何ですか? 上記のコードを改善するにはどうすればよいですか?

ありがとうございました

4

3 に答える 3

2

もしかして、こういう意味だったの?

class msg{
    typedef void (*callback_t)(void *);

    bool callback_check(callback_t callback);
};

void callbackvoid(以前に宣言した関数ポインターとは無関係な) 型のパラメーターを宣言しようとしていますがcallback、これは違法です。

void (*callback)(void *);関数へのポインタ型のメンバー宣言です。それがあなたの意図であれば、メンバー関数に渡す必要はありません。あなたがすることができます:

class msg{
    void (*callback)(void *);
    bool callback_check()
    {
        return callback != nullptr;
    }
};
于 2013-05-07T11:49:55.930 に答える
2

タイプvoidは基本的に「無」を意味します。そして、何もない関数に引数を持つことはできません。適切なタイプを指定する必要があります。

それが実際のコールバック関数であると思われる場合は、関数ポインタとして宣言します。次に例を示します。

bool callback_check(const msg_type_e, void (*callback)(void*));

ただしstd::function、代わりに使用することをお勧めします。これにより、すべての種類の関数 (ラムダ、メンバー関数を使用したメンバー関数、std::bindまたは署名に一致する他の呼び出し可能なオブジェクトなど)を渡すことができるためです。

bool callback_check(const msg_type_e, std::function<void(void*)> callback);

もちろんcallback、クラスのメンバーもstd::functionオブジェクトにする必要があります。


std::functionオブジェクトに有効な呼び出し可能な「関数」が割り当てられているかどうかを確認するために、クラスにはブール演算子があるため、ブール式で使用できます。お気に入り:

if (this->callback)
{
    // Callback should be callable
    this->callback(...);
}
于 2013-05-07T11:50:15.873 に答える
0

あなたのcallbackパラメータは単に間違っています。これは次のようになります。

class msg{
//other stuffs before
        typedef void (*callback)(void *);
    bool callback_check(const msg_type_e, callback cb);
}

パラメータの型はvoid意味がありません。それらは合法ではありません。C のパラメーター リストで使用できる唯一の場所voidは、関数がパラメーターをまったく取りたくない場合、つまりパラメーターvoid myfunc(void)がないことを意味する場合です。

関数に渡すことができる型は へvoid*のポインタですvoid。つまり、指している型には関連付けられた型がありません。voidvoid へのポインターは、それ自体とはまったく異なるものであることに注意してください。

于 2013-05-07T11:50:25.130 に答える