gpt4 book ai didi

C++回调函数,静态函数内部调用成员变量

转载 作者:行者123 更新时间:2023-11-28 06:36:18 24 4
gpt4 key购买 nike

我最近决定开始使用回调函数来让我的生活更轻松一些。但是,我遇到了一些问题:

#include <iostream>
#include <functional>
#include <memory>

class setCallback
{
public:
setCallback() {}
setCallback(std::function<int()> func) : callback(func) { }

int call() { return callback(); }
private:
std::function<int()> callback;
};

class callThis
{
public:
callThis() : number(10) {}

static int another()
{
return number;
}
int number;
};

int main(int argc, char** argv[])
{
std::shared_ptr<setCallback> caller;
std::shared_ptr<callThis> funcholder;

funcholder.reset(new callThis);
caller.reset(new setCallback(funcholder->another));

std::cout << caller->call() << "\n";

std::cin.get();
}

正如您从代码中看到的那样,我将函数从“callthis”拉入“setCallBack”。如果需要,这使我可以保留该功能以备后用。这非常有效,但是,如果我尝试将成员变量从“callthis”加载到静态函数中,它显然不会起作用(使用值可以)。

有解决办法吗?我想使用静态函数访问在类中找到的变量;在传递给回调时可选择避免使用静态函数(但我认为由于回调的工作方式,这是不可能的)。

我听说过包装类,但我不完全确定我将如何实现它。一些见解将不胜感激。

非常感谢。

编辑:

解决了使用回调函数调用变量的问题,作者 B Sahu

解决了使用回调调用函数的问题,而不是使函数被调用为静态并保持事物合理解耦

我研究了如何使用 C++11 调用非静态函数;我认为如果有人最终遇到与我相同的问题,这可能会有用。它的工作原理与 R Sahu 提出的相同,但是,使用其中的类型和过程最终会更简洁一些。使用 std::bind(class::func, object) 您可以有效地获得相同的结果。

int main(int argc, char** argv)
{
std::function<void(void)> somefunc;

Functionholder func;

somefunc = std::bind(&Functionholder::say, &func);
}

功劳归功于:This beautiful person

当在一个更复杂的例子中使用时,有一个保存要调用的函数的类,一个将接受函数并在需要时调用它的调用者类和一个 Binder /状态类(注意,我将其用于游戏 UI),你真的可以得到一些相当简洁和不耦合的代码:

#include <iostream>
#include <functional>

class Functionholder
{
public:
void say() { std::cout << "hello!\n"; }
};

class CallbackHandler
{
public:
CallbackHandler(){}
CallbackHandler(std::function<void()> call) { callback = call; }

void update()
{
//something happens to call this
callback();
}

std::function<void()> callback;
};

class TheState
{
public:
TheState()
{
hand = CallbackHandler(std::bind(&Functionholder::say, &func));
}

void update() { hand.update(); }

Functionholder func;
CallbackHandler hand;
};

int main(int argc, char** argv)
{
TheState state;
state.update();

std::function<void(void)> somefunc;

std::cin.get();
}

如果您有任何改进,请告诉我!

最佳答案

提供使用用户指定数据调用回调函数的能力。然后,在回调函数中使用数据。

#include <iostream>
#include <functional>
#include <memory>

class setCallback
{
public:
setCallback() {}
setCallback(std::function<int(void*)> func) : callback(func) { }

int call(void* data) { return callback(data); }
private:
std::function<int(void*)> callback;
};

class callThis
{
public:
callThis() : number(10) {}

static int another(void* data)
{
callThis* ptr = static_cast<callThis*>(data);
return ptr->number;
}
int number;
};

// Fixed this line. You had
// int main(int argc, char** argv[])
int main(int argc, char** argv)
{
std::shared_ptr<setCallback> caller;
std::shared_ptr<callThis> funcholder;

funcholder.reset(new callThis);
caller.reset(new setCallback(callThis::another));

std::cout << caller->call(funcholder.get()) << "\n";

std::cin.get();
}

关于C++回调函数,静态函数内部调用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724254/

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