gpt4 book ai didi

c++ - 错误 : a pointer to a bound function may only be used to call the function

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

我一直在尝试将(一个类的)函数指针分配给(另一个类的)成员函数,如下所示:

--- 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()
{
...
}

我收到这个错误:

error C3867: 'Screen::Handle': function call missing argument list; use '&Screen::Handle' to create a pointer to member

如果 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);
}
};

关于c++ - 错误 : a pointer to a bound function may only be used to call the function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872986/

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