错误:指向绑定函数的指针只能用于调用该函数
Error: a pointer to a bound function may only be used to call the function
我一直在尝试将函数指针(类的)分配给(另一个类的)成员函数,像这样:
--- Game.h ---
#ifndef GAME_H
#define GAME_H
#include "Screen.h"
class Game
{
private:
void (*HandleCurrentScreen)();
public:
void SetScreen(const Screen& newScreen);
};
#endif
--- Game.cpp ---
#include "Game.h"
#include "Screen.h"
void Game::SetScreen(const Screen& newScreen)
{
HandleCurrentScreen = newScreen.Handle; //Produces the error
}
--- Screen.h ---
#ifndef SCREEN_H
#define SCREEN_H
class Screen
{
public:
void Handle();
};
#endif
--- Screen.cpp ---
#include "Screen.h"
void Screen::Handle()
{
...
}
我得到这个错误:
错误C3867: 'Screen::Handle':函数调用缺少参数列表;使用'&Screen::Handle'创建指向成员
的指针
如果HandleCurrentScreen
指向也在Game类中定义的函数,则似乎可以正常工作。我一直在寻找其他有这个问题的人,但似乎没有人有这样的情况。
一个可能有效的解决方案是这样的:
Screen* p_currentScreen;
void Game::SetScreen(const Screen& newScreen)
{
p_currentScreen = &newScreen;
}
然后调用p_currentScreen->Handle()
而不是HandleCurrentScreen
,但这对我来说似乎效率稍低。
我能做些什么来解决这个问题?我应该只是使用一个指针到一个类,而不是一个函数指针?
欢迎提出建议
你的错误告诉你该怎么做:
Screen::Handle': function call missing argument list; use '&Screen::Handle
你应该这样写:
void Game::SetScreen(const Screen& newScreen)
{
HandleCurrentScreen = &Screen::Handle;
}
仅在newScreen::handle
是静态函数的情况下才会工作。但在这种情况下,你可以在编译时初始化它。否则,HandleCurrentScreen
应该是指向成员函数(PTMF)的指针,声明为:
void (Screen::*HandleCurrentScreen)();
现在,为了从PTMF调用函数,还需要一个函数对象。这使你的第二个解决方案更好。
另一个选项是std::bind:
class Game
{
private:
std::function<void()> HandleCurrentScreen;
public:
void SetScreen(const Screen& newScreen) {
HandleCurrentScreen = std::bind(&Screen::Handle, &newScreen);
}
};
std::bind
就是用来解决这类问题的:
// --- Game.h ---
#ifndef GAME_H
#define GAME_H
#include "Screen.h"
#include <functional>
class Game {
private:
std::function<void ()> HandleCurrentScreen;
public:
void SetScreen(const Screen& newScreen);
};
#endif
// -- Game.cc --
#include "Game.h"
#include "Screen.h"
void Game::SetScreen(const Screen& newScreen){
HandleCurrentScreen = std::bind( &Screen::Handle, newScreen);
}
然而,由于您的Game
类只需要一个函数,因此最好将Screen
类完全从Game
定义中删除,并将函数直接传递给它:
#include <functional>
class Game {
public:
typedef std::function<void ()> ScreenHandler;
private:
ScreenHandler HandleCurrentScreen;
public:
void SetHandle(const ScreenHandler &handle);
};
#endif
// -- Game.cc --
#include "Game.h"
void Game::SetHandle(const ScreenHandler &handle){
HandleCurrentScreen = handle;
}
这样,您就可以选择以您认为合适的方式构建处理程序,而不涉及Game
。
把函数设为静态
相关文章:
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- cv2有什么区别.StereoSGBM_create() 和 cv2.StereoBM_create() 函数用于 Op
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- Qt中是否有QLabel::setScaledContent等效函数用于QGraphicsScene?
- 递归函数用于计算 n 个数字之和的意外输出
- 替换(或重新实现?)std::函数用于某些统计和测试
- 如何将成员函数用于同一类的不同对象
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 如何在 Cython 中将C++中的模板化函数用于两种类型
- 编译库的C 挂钩函数用于调试
- 在已发布的结构中添加构造函数(用于 memcpy)是否安全?
- 没有匹配的构造函数用于初始化模板化类的构造函数
- C 无匹配函数用于呼叫错误(默认为参考通过)
- 没有匹配函数用于调用 std::transform,未解析的重载函数类型
- 函数用于随机数(C++11)
- 是否有一个函数用于遍历POSIX环境变量
- “没有匹配的构造函数用于初始化”与矢量
- 函数用于C样式字符串和C++std::string
- 有选择地内联函数(用于调试目的)
- 两个模板函数用于两种标准类型