gpt4 book ai didi

自己类中的 C++ 非静态函数指针

转载 作者:行者123 更新时间:2023-11-30 02:32:58 27 4
gpt4 key购买 nike

我正在用 C++ 编写自己的计时器。我想知道是否可以将一个函数传递给计时器构造函数并稍后调用该函数。

我正在考虑为此使用函数指针,但是我找不到在类本身内部传递非静态函数的解决方案。

G++ 给我这个错误:

Server.cpp:61:54: error: invalid use of non-static member function serverTimer = new timer::Timer(onTimerTick,3000);

我的类 Server.cpp 如下所示:

    private:
void onTimerTick(){
//do something with class variables, so can't use static? :(
}
public:
Server(int port) : socket(port)
{
serverTimer = new timer::Timer(onTimerTick,1000);
serverTimer->start();
}

这是timer.h:

#ifndef TIMER_H
#define TIMER_H
namespace timer {
class Timer{
public:
Timer(void (*f) (void),int interval);
std::thread* start();
void stop();
private:
int interval;
bool running;
void (*f) (void);
};
}
#endif

这是timer.cpp:

#include <thread>
#include <chrono>
#include "timer.h"

timer::Timer::Timer(void (*f) (void),int interval){
this->f = f;
this->interval = interval;
}

std::thread* timer::Timer::start(){
this->running = true;
return new std::thread([this]()
{
while(this->running){
this->f();
std::this_thread::sleep_for(std::chrono::milliseconds(this->interval));
}
});
//return
}

void timer::Timer::stop(){
this->running = false;
}

这个问题是否有更好的解决方案,或者这是传递我的函数的错误语法?希望有人对此有很好的解决方案。

最佳答案

问题是您为独立函数指定了一个函数指针,但您正试图将它绑定(bind)到一个成员函数。 (非静态)成员函数确实不同:它们有一个隐藏的 this 指针需要传递给它们。

要解决这个问题,一种解决方案是使用 std::function 而不是函数指针,然后将必要的代码作为 lambda 传递。

所以你的函数指针变成了:

std::function<void (void)>;

你可以这样调用它:

serverTimer = new timer::Timer([this]{onTimerTick ();},1000);

关于自己类中的 C++ 非静态函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35855092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com