C++ c+中的函数指针增量说明+;
我已经在cpp中编写了一个类Seat&我声明了一个函数指针。 下面给出了类的实现 Seat.cppC++ c+中的函数指针增量说明+;,c++,function-pointers,C++,Function Pointers,我已经在cpp中编写了一个类Seat&我声明了一个函数指针。 下面给出了类的实现 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::*checkSeat
#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)
{
}
座位h
#include <string>
using namespace std;
class Seat :
public Vehicle
{
int seatId;
int seatStatus;
static int count;
public:
Seat(void);
~Seat(void);
void (*checkSeatStatus)();
};
#包括
使用名称空间std;
班级座位:
公共车辆
{
国际海洋贸易署;
int seatStatus;
静态整数计数;
公众:
座位(空);
~座位(空);
无效(*checkSeatStatus)();
};
它在函数指针声明处显示错误:
“checkSeatStatus”:非法使用类型“void”
背后的原因是什么,它是否需要初始化函数指针?如果
checkSeatStatus
是一个成员函数,它应该是:
void* Seat::checkSeatStatus(void) {
...
}
在类声明中包含函数原型:
void* checkSeatStatus(void);
如果它是一个成员变量,包含一个可以设置的函数指针,那么,嗯,不要这样做。。。很可能是错误的设计
如果(根据名称)它只是返回当前值status
,那么它应该是一个返回int
而不是void*
的函数:
int Seat::checkStatus(void) {
return status;
}
注意:我从方法名称中删除了
Seat
,因为它应该是隐式的,因为您在Seat
对象上调用了它。如果checkSeatStatus
是一个成员函数,它应该是:
void* Seat::checkSeatStatus(void) {
...
}
在类声明中包含函数原型:
void* checkSeatStatus(void);
如果它是一个成员变量,包含一个可以设置的函数指针,那么,嗯,不要这样做。。。很可能是错误的设计
如果(根据名称)它只是返回当前值status
,那么它应该是一个返回int
而不是void*
的函数:
int Seat::checkStatus(void) {
return status;
}
注意:我从方法名称中删除了
Seat
,因为它应该是隐式的,因为您在Seat
对象上调用了它。这并没有回答您提出的问题,但将显示如何在线程中使用该函数
使用它实际上很容易使用任何成员函数启动线程。重要的是它应该是一个普通的成员函数,声明如下
class Seat
{
...
public:
...
void checkSeatStatus();
};
然后,要使用函数创建线程,首先需要类的实例:
Seat seat;
然后,您只需创建线程
std::thread my_thread{&Seat::checkSeatStatus, seat};
在主线程中执行任何其他处理,然后加入已创建的线程:
my_thread.join();
这里有两件重要的事情需要知道:
Seat
类的实例(上面的变量Seat
必须比线程的寿命长。如果它超出范围并在线程结束之前被破坏,将导致未定义的行为
您还必须在线程对象(上面的变量
my_thread
)被销毁之前进行线程处理。这不会回答您提出的问题,但会显示如何在线程中使用该函数
使用它实际上很容易使用任何成员函数启动线程。重要的是它应该是一个普通的成员函数,声明如下
class Seat
{
...
public:
...
void checkSeatStatus();
};
然后,要使用函数创建线程,首先需要类的实例:
Seat seat;
然后,您只需创建线程
std::thread my_thread{&Seat::checkSeatStatus, seat};
在主线程中执行任何其他处理,然后加入已创建的线程:
my_thread.join();
这里有两件重要的事情需要知道:
Seat
类的实例(上面的变量Seat
必须比线程的寿命长。如果它超出范围并在线程结束之前被破坏,将导致未定义的行为
您还必须在thread对象(上面的变量
my_thread
)被销毁之前执行tread操作。您将checkSeatStatus
声明为成员变量,而不是成员函数。因此,它应该初始化为指向某个可调用函数,但它不应该有函数体。检查座椅状态的目的是什么?它应该是一个实际的成员函数吗?它应该是一个变量吗?它是一个成员函数,所以它不应该是一个成员变量,而是一个成员函数,一个方法?它应该返回什么?“通用指针”(即void*
)?什么都没有(即void
)?还别的吗?它应该做什么?它将查找座椅的状态并设置成员变量seatStatusOh.:(.在考虑线程之类的高级功能之前,首先需要弄清楚座椅实际上不是车辆的子类,而是车辆“拥有”的东西。您将checkSeatStatus
声明为成员变量,而不是成员函数。因此,它应该初始化为指向某个可调用函数,但不应该有函数体。checkSeatStatus
的用途是什么?它应该是实际的成员函数吗?它应该是变量吗?它是成员函数,所以不应该是是一个成员变量,但却是一个成员函数、一个方法?它应该返回什么?一个“通用指针”(即void*
)?什么都没有(即void
)?返回其他东西?它应该做什么?它将找到seat的状态并设置成员变量seatStatusOh.:(.在考虑线程之类的高级功能之前,首先需要弄清楚座椅实际上不是车辆的子类,而是车辆“拥有”的东西.现在它显示了这个错误'Seat::checkSeatStatus':必须返回一个值,这并不奇怪,因为您声明了一个应该返回void*
指针的函数。因为您没有说明该函数应该做什么,所以我没有对此进行评论,但鉴于status
是int
我希望您的函数实际上应该是int-Seat::checkSeatStatus(void)
现在它显示了这个错误'Seat::checkSeatStatus':必须返回一个值,因为您声明了一个支持