0
class classe (){
public: 
    int key;

    static void *funct(void *context){
        printf("Output: %d, ", key);
    }

    void Go(){
        classe c = static_cast<this>(context); //<- This doesn't work, Context of this-> goes here
        pthread_create(&t, NULL, &classe::funct, c);
    }
};

int main(){

    classe c;
    c.key = 15;
    c.Go();

    c.key = 18;
    c.Go();
}

出力は になるはずです。問題は、スローエラーOutput: 15, Output: 18,のコンテキストを取得することです。this

誰かがこれを修正する方法を知っていますか?

4

4 に答える 4

2

あなたのコードにはいくつかの問題があります。

まず、static_cast<>に型が必要であり、変数のように機能します (つまり、型ではありません) <>thisの型はthis内の (オブジェクトclasse*へのポインター) です。classeclasse

第 2 に、 では利用できませcontextclasse:Go()。その名前のパラメーターがありますが、classe::fuct()使用したい場所では使用できません。

3 番目にpthread_create()、フリー関数 (または静的メンバー関数) を想定し、クラス メンバー関数 ( classe::funct) を提供します。クラスメンバー関数には、動作するオブジェクトが必要です (暗黙のパラメーター == のようなものですthis)。また、渡すことができるt定義済みのものもありませんclasse::Go()pthread_create()

あなたは試すことができます:

static void *funct(void *key){ // funct is now a free function, all data is provided to it
    printf("Output: %d, ", *static_cast<int*>(key)); 
} 

class classe ()
{ 
public:  
  int key; 

  void Go(){
    pthread t; 
    pthread_create(&t, NULL, funct, &key); // pass (address of) key to funct
  } 
}; 

int main(){ 

  classe c; 
  c.key = 15; 
  c.Go(); 

  c.key = 18; 
  c.Go(); 
}
于 2012-04-06T01:38:48.933 に答える
1

まず、contextどこかを定義する必要があります。2 つ目thisは、メンバー関数が呼び出されているオブジェクトへのポインターを表すキーワードです。static_castテンプレート引数に型が必要です。ステートメントをコンパイルするには、を に置き換えstatic_cast<this>static_cast<classe*>のタイプを に変更cします。classe *

于 2012-04-06T01:36:06.320 に答える
0

いくつかの重要な部分がどこにあるのか、少し混乱しているようです。これは、あなたが望むことのほとんどを行うと私が思う大まかなスケルトンです。

class classe {
    public:
        classe(int k) : key(k) { }

        void Go() {
            // where does "t" come from?
            pthread_create(&t, NULL, &funct, static_cast<void*>(this));
        }

    private:
        int key;

        static void* funct(void* context) {
            classe* self = static_cast<classe*>(context);
            printf("Output: %d ", self->key);
            return 0; // not sure this is what you want
        }
};

int main() {
    classe c(15);
    c.Go();
}
于 2012-04-06T01:50:02.963 に答える