0

いくつかの検索に基づいて解決策を適用しましたが、問題はまだ残っています。助けてくれてありがとう。

error: must use '.*' or '->*' to call pointer-to-member function ...

ソースコード:

#include <stdio.h>

class A
{
  public:

    struct data;
    typedef int (A::*func_t)(data *);
    typedef struct data
    {
      int i;
      func_t func;
    }
    data;

    data d;

    void process()
    {
        d.func(&d);
    }

    A()
    {
        d.i = 999;
        d.func = &A::print;
    }

    int print(data *d)
    {
        printf("%d\n", d->i);
        return 0;
    }

};

int main()
{
    A *a = new A;

    a->process();

    return 0;
}
4

5 に答える 5

3
d.func(&d);

十分ではありません。funcの非静的メンバーを指しているメンバー関数ポインターですA。したがって、 のオブジェクトで呼び出すことができますA。したがって、これを書く必要があります:

(this->*(d.func))(&d);

これを 内に記述すれば機能しますA

func外部から実行したい場合、たとえば in main()、構文は次のとおりです。

A a; 
(a.*(a.d.func))(&a.d);

それは醜い構文です。

于 2013-01-14T18:39:09.777 に答える
1

あなたのprocess関数は呼び出しを試みますd.funcが、メンバー関数へのポインターです。メンバー関数へのポインターは、何らかのオブジェクトで呼び出す必要があります。Aおそらく、 のインスタンスを にしたいthis場合、process関数は次のようになります。

void process()
{
    (this->*(d.func))(&d);
}

->*メンバー関数へのポインターがある場合、演算子を使用してメンバー関数を呼び出すことに注意してください。

于 2013-01-14T18:38:42.207 に答える
0

他の回答では、メンバーへのポインター関数を呼び出す必要があると既に述べています(メンバー(this->*d.func)(&d)あるオブジェクトを提供する必要があるため)

別のオプションは、関数を静的関数にすることです。これは、呼び出しに特別な構文を必要としません。これを行うには、typedef を次のように変更します。

typedef int (*func_t)(data *);

次に、print関数を静的にします。

static int print(data *d)
{
    ...
}

今、あなたはただ電話することができますd.func(&d)

于 2013-01-14T18:49:48.087 に答える
-1

残念ながら、あなたがしようとしていることは不可能です。その理由は、メンバー関数でprintはないからです。これは、ポインターstaticである暗黙の最初の引数が必要であることを意味します。this

次のようなstd::functionand関数を使用することをお勧めします。std::bind

class A
{
    struct data
    {
        std::function<void(const data&)> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

    void process()
    {
        d.func(d);
    }

    void print(const data& my_data)
    {
        std::cout << my_data.i << '\n';
    }
};

もちろん、print関数には適切なthisポインターがあるため、データ構造を渡す必要はなくなりました。

class A
{
    struct data
    {
        std::function<void()> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

    void process()
    {
        d.func();
    }

    void print()
    {
        std::cout << d.i << '\n';
    }
};
于 2013-01-14T18:39:47.140 に答える
-2

メンバーのポインターを呼び出すには、メンバーであるクラスが this パラメーターである必要があります。

試す:

A a;
a.*(d.func)(&d);
于 2013-01-14T18:40:26.773 に答える