2016-04-29 121 views
0

我已經在cpp中寫了一個類Seat &我聲明瞭一個函數指針吧。 類執行力度給出下面C++中的函數指針聲明

Seat.cpp

#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'

背後的原因是什麼? ,它是否需要函數指針的任何初始化?

+2

您將'checkSeatStatus'聲明爲成員*變量*而不是成員函數。因此,它應該被初始化爲指向一些可調用的函數,但它應該沒有函數體。 checkSeatStatus的目的是什麼?它應該是一個真正的成員函數嗎?它應該是一個變量? –

+0

它是一個成員函數 –

+0

所以它不應該是一個成員變量,而是一個成員函數,*方法*?它應該返回什麼? 「通用指針」(即「void *」)?什麼都沒有(即'void')?還有別的東西?我們應該做什麼? –

回答

2

如果checkSeatStatus旨在是一個成員函數應該是:

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

與函數原型的類聲明中:

void* checkSeatStatus(void); 

如果它的意圖是一個成員變量保持函數指針,你可以設置,那麼,不要這樣做......這可能是錯誤的設計。

如果(每名),它只是應該返回的status當前值,那麼它應該是一個返回int,而不是一個void *功能:

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它實際上很容易使用任何成員函數啓動線程。最重要的部分是,它應該是一個正常的成員函數,所以聲明如下

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

然後使用你首先需要一個類的實例函數來創建一個線程:

Seat seat; 

然後你簡單地創建線程

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

什麼就做什麼其他的處理要在主線程做,然後再加入你已經創建線程:

my_thread.join(); 

有幾個知道這裏很重要的東西:Seat類(超過該可變seat)必須小於線程長壽的實例。如果它超出範圍並在線程結束之前被破壞,將導致未定義的行爲

您還必須join在線程對象(上面的變量my_thread)被破壞之前。

+1

一般來說,它'.join()'或'.detach()',但我同意'.detach()'在這裏不起作用。沒有體面的方法來確定檢測線程是否完成,這意味着'座位「必須無限期地保持活動狀態,對於可連接的線程,只能保持活動狀態直到」加入'返回。 – MSalters