2016-04-29 8 views
0

私はクラスシートをcppに書いた&私は関数ポインタそれを宣言しました。 クラスimplimentation Seat.cpp関数ポインタdelclaration in C++

下に与えられる

#include "StdAfx.h" 
#include "Seat.h" 

int Seat::count = FL; 
Seat::Seat(void) 
{ 
    seatId = Seat::count; 
    seatStatus = unoccupied; 
    Seat::count++; 
} 

Seat::~Seat(void) 
{ 

} 


void Seat::*checkSeatStatus(void) 
{ 


} 

Seat.h

#include <string> 
using namespace std; 

class Seat : 
    public Vehicle 
{ 
    int seatId; 
    int seatStatus; 
    static int count; 

public: 
    Seat(void); 
    ~Seat(void); 
    void (*checkSeatStatus)(); 
}; 

それは関数ポインタ宣言でエラーを示す:

'checkSeatStatus':不正使用タイプ 'void'のタイプ

理由は何ですか? 、それは関数ポインタの任意の初期化が必要ですか? checkSeatStatusはメンバ関数であることを意図している場合

+2

メンバ関数ではなく、メンバ変数*として* checkSeatStatusを宣言します。このように、呼び出し可能な関数を指すように初期化する必要がありますが、関数本体を持たないようにしてください。 'checkSeatStatus'の目的は何ですか?それは実際のメンバー関数でなければなりませんか?それは変数であるべきですか? –

+0

これはメンバ関数 –

+0

だから、メンバ変数でなく、メンバ関数、*メソッド*であるべきですか?それは何を返すべきですか? "汎用ポインタ"(すなわち 'void *')?何もありません(つまり、 'void')?何か他のものを返しますか?私たちはそれが何をすべきか? –

答えて

2

それは次のようになります。

void* Seat::checkSeatStatus(void) { 
    ... 
} 

関数プロトタイプでのクラス宣言内:

void* checkSeatStatus(void); 

メンバ変数を保持するためのものです場合あなたが設定できる関数ポインタは、そうしないでください...おそらく間違ったデザインです。

それだけで、それが代わりにvoid *intを返す関数であるべきstatusの現在の値を返すことになっています(名あたり)場合:

int Seat::checkStatus(void) { 
    return status; 
} 

NB:私は、メソッドからSeatを削除あなたがSeatオブジェクトでそれを呼び出したという事実から暗黙的であるべきだからです。

+0

これはこのエラーを示しています'Seat :: checkSeatStatus':値が –

+1

でなければ返りませんが、あなたは 'void *'ポインタを返す関数を宣言しているので、あなたはその関数が何をすべきかについて何も言わなかったので、 'status'は' int'なので、あなたの関数は実際には 'int Seat :: checkSeatStatus(void)'になるはずです。 – Alnitak

+0

スレッド内にこの関数ポインタを渡したいと思っています –

0

これはあなたが聞いた質問には答えませんが、スレッドでこの関数を使用する方法を示します。

std::threadを使用すると、実際にはメンバー関数を使用してスレッドを開始するのは非常に簡単です。あなたはその後、

Seat seat; 

そして:重要な部分はそうあなたが最初のクラスのインスタンスを必要とする機能を使用してスレッドを作成するために、次に

よう
class Seat 
{ 
    ... 
public: 
    ... 
    void checkSeatStatus(); 
}; 

を宣言し、それは通常のメンバ関数でなければならないことです単に

std::thread my_thread{&Seat::checkSeatStatus, seat}; 

は、あなたがメインスレッドで実行したい処理を他の何でも行い、その後、あなたが作成したスレッドに参加するスレッドを作成します。

スレッドよりも長生きしなければなりません Seatクラス(上記変数 seat)のインスタンス:
my_thread.join(); 

は、ここで知っておくことが重要なものがいくつかあります。範囲外になり、スレッドが終了する前に破棄され、の未定義の動作につながります。

また、スレッドオブジェクト(上記の変数my_thread)が破棄される前にトレッドをjoinにする必要があります。

+1

一般に、 '.join()'や '.detach()'になりますが、 '.detach()'はここでは動作しません。デテカンされたスレッドが終了したかどうかを判断する方法はありません。参加可能なスレッドの場合、 '' seat''は ' join'が返されます。 – MSalters