只汝 2021-10-15 11:16 采纳率: 60%
浏览 51
已结题

c++/qt 函数指针使用时遇到的问题

我要实现一个约瑟夫环的功能,前端得到总数和出列编号,后端通过这个函数来走一遍约瑟夫环流程,这里用到了函数指针

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了。

现在卡在这个地方了,进行不下去了,看了半天不知道为什么非得要静态变量。

  • 写回答

2条回答 默认 最新

  • bostonAlen 2021-10-15 11:54
    关注

    成员函数leaveQueue第一个参数默认是this指针, 所以leaveQueue函数加上默认参数其实是2个参数。
    所以你这里一种方法时把leaveQueue函数不放在类中,
    另一种是leaveQueue加static修饰 ,静态函数就没有this指针,但你又调用了Widget成员函数。
    这个是c++类设计时的规定,你只有改变你的实现方式了。
    补充:
    其实c++里面很少用原始的函数指针了,这样类型基本是在c中用的多
    你可以了解下std::functional、function、bind,可调用对象的相关操作,是可以替代函数指针的,实现回调也很方便

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 创建了问题 10月15日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效