2016-04-29 4 views
0

Я написал класс Seat в cpp & Я объявил его указателем функции. класс implimentation приведен нижеФункциональный указатель delclaration в 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' как член * variable *, а не функцию-член. Поэтому он должен быть инициализирован, чтобы указать на какую-то вызываемую функцию, но у нее не должно быть тела функции. В чем цель '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 *'. Поскольку вы ничего не сказали о том, что должна делать эта функция, я didn ' t комментарий к этому, но учитывая, что '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}; 

Do любой другой обработки, которую вы хотите сделать в главном потоке, а затем присоединиться нить вы создали:

my_thread.join(); 

Есть несколько важных вещей, чтобы знать здесь: Экземпляр Seat класса (переменная seat выше) должны жить дольше, чем нить.Если он выходит из области действия и разрушается до конца потока, что приведет к неопределенным поведением.

Вы должны также указать join протектора перед объектом нити (переменная my_thread выше) разрушена.

+1

В общем, это было бы '.join()' или '.detach()', но я согласен с тем, что '.detach()' здесь не работает. Нет никакого достойного способа выяснить, выполнен ли детективный поток, сиденье "должно оставаться на неопределенное время. Для сплошной нити его нужно поддерживать только до тех пор, join' возвращает. – MSalters

Смежные вопросы