2016-03-24 13 views
1
class Customer{ 
public: 
     Customer(){}; 
     Customer(int i) 
     {id=i;} 
     ~Customer(){...}; 
     static void* run(void* arg) 
     { 
     //code for execution 
     return NULL; 
     } 
private: 
static int id; 
} 

int main(void) 
{ 
    int index; 
    int status; 
    //Create Customer Threads 
    pthread_t Customer_Threads[50]; 
    Customer *Customers; 
    Customers=new Customer[50]; 
    // create 50 Customer threads 
    for (index = 0; index < 50; index++) { 
     Customers[index]=*new Customer(index); 
     status = pthread_create (&Customer_Threads[index], NULL, Customers[index].run, NULL); 
     assert(0 ==status); 
    } 
} 

私の質問は、私はクラスのお客様に関数を呼び出すのpthread_createを使用しようとすると、エラーが約ポップアップ表示され、クラス内の関数「顧客への未定義参照::〜A()」「 と」未定義の参照Customer :: A()へ私はクラスのCustomerオブジェクトの配列を作成し、クラスのお客様には、実行機能を実行するためにmulti_threadを使用したいpthread_createの呼び出し

、私はこれらのエラーに対処する方法がわかりません。ありがとう。

私はXcodeでC++を使用するとLinuxでコンパイルします。

---------------

エラー: 'Customer :: id'への未定義参照。

なぜわかりません。

+1

のようになりますが、コンストラクタとデストラクタは宣言しますが、*定義*はどこにありますか?実装)とコンストラクタとデストラクタの? –

+0

また、この式 'Customers [index] = * new Customer(index)'はあなたにメモリリークを与えます。 Javaとは異なり、オブジェクトインスタンスを作成するために 'new'を使う必要はありません。 'Customer(index)'を実行するだけで、それは 'Customers [index] = Customer(index)'に変更されます。 –

+1

これは、**この**コードのコンパイル時に受け取ったエラーを決して想像できません。 'Customer'はコンストラクタとデストラクタを持っていれば、' A'ではなく 'Customer'('〜Customer')というタイトルになります。あなたのクラス定義の後に ';'が終わっていないことにも気づきます。コンパイラは、リンクフェーズに達するずっと前から、これらのことについて天国に文句を言うべきです。 – WhozCraig

答えて

0

私の代わりにC配列のSTLコンテナを使用し、あなたにお勧めします。

カスタマー::あなたは、このように、この関数を渡す必要はありませんので、実行は静的関数です:あなたは、静的な関数へのポインタを渡す必要があるのpthreadする静的関数を渡すために

status = pthread_create (..., Customers[index].run, ...); 

status = pthread_create(..., &Customers::run, ...); 

私たちは関数を渡しますが、具体的なCustomerオブジェクトをスレッドに渡したいと思います。

コードの最終バージョンは

void *Customer::run(void *arg) 
{ 
    Customer *this_ = (Customer *)arg; 
    // Do something 
} 

std::list<pthread_t> pthreads(50); 
std::list<Customer *> Customers(50); 

for (size_t i = 0; i < pthreads.size(); ++i) 
{ 
    Customers[i] = new Customer(); 
    status = pthread_create(&pthreads[i], &Customer::run, (void *)Customers[i]); 
    ... 
} 

for (size_t i = 0; i < pthreads.size(); ++i) 
{ 
    pthread_join(pthreads[i]); // block until thread end 
    delete Customers[i]; // free mem 
} 
+0

ありがとう、私はあなたのメソッドを使用しようとしましたが、私はまだ以下のようなエラーが見つかりました:関数 'Customer :: Customer()':未定義の参照 'Customer :: id'、私はクラスisn 'このクラスの実装に関するヒントを親切に教えてもらえますか? – Mantrapps

+0

私はあなたがobjファイルの中でcustomer :: idを初期化していなかったと思います。つまり、int customer :: Id = 1;を追加します。 cppファイル内のクラス宣言の後 –

+0

はい、修正されました。ありがとう – Mantrapps

関連する問題