我要实现一个约瑟夫环的功能,前端得到总数和出列编号,后端通过这个函数来走一遍约瑟夫环流程,这里用到了函数指针
template<class T>
void CircledLinkedList<T>::Josephus(int leaveIndex, void (*dowithLeave)(T data))
{
cirLinkedList pre = head, next = head->next;
int count = 1;
while (head->next != head) {
if(next == head) {
pre = pre->next;
next = next->next;
continue;
}
if(count == leaveIndex) {
count = 0;
}
count++;
if(count == leaveIndex) {
dowithLeave(pre->data);
pre->next = next->next;
free(next);
next = pre->next;
continue;
}
pre = pre->next;
next = next->next;
}
}
调用以上函数的函数如下,但是在调用的时候出现报错
void Widget::chooseKing()
{
monkeyqueue->Josephus(ui->leaveNum->value(), leaveQueue);//报错,错误信息如下
/*widget.cpp:72:50: error: reference to non-static member function must be called*/
}
void Widget::leaveQueue(monkeyLabel *leave)
{
ui->queueLeave->layout()->addWidget(leave);
QEventLoop eventloop;
QTimer::singleShot(1000, &eventloop, SLOT(quit()));
eventloop.exec();
}
错误的内容从我的理解角度是,leaveQueue函数不是static的,但是我看了很多示例,按理来说,用函数指针时,应该不会报这样的错。
如果我按报错的内容改,把leaveQueue定义成static的,那么leaveQueue函数内的ui这个变量就没法调用,静态函数里调用非静态变量,肯定不行。但是ui还不能再改成static了。
现在卡在这个地方了,进行不下去了,看了半天不知道为什么非得要静态变量。