【发布时间】:2014-07-21 19:20:14
【问题描述】:
我一直在尝试将(一个类的)函数指针分配给(另一个类的)成员函数,如下所示:
--- 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,但这对我来说似乎效率稍低。
我能做些什么来解决这个问题?我应该只使用指向类的指针而不是函数指针吗?
欢迎任何建议。
【问题讨论】:
-
C++ 不是后期绑定语言。它绝对不是为了让您能够在运行时覆盖 vtable 而设计的。你的第二种方法是应该怎么做的。
-
@aruisdante 要么我不理解代码,要么我不理解您的评论。这里没有 vtable。
-
也许我读错了代码/描述,但看起来 OP 试图通过赋值覆盖类的方法在运行时解析的内容。类似于你可以在 python 中执行
instance.FUNCTION_NAME = NEW_FUNCTION,其中FUNCTION_NAME是一个类方法,NEW_FUNCTION是一个可调用的,现在任何时候代码的任何其他部分称为instance.FUNCTION_NAME()他们实际上会调用NEW_FUNCTION. -
@didierc 这有什么帮助?
-
HandleCurrentScreen应该是void (Screen::*HandleCurrentScreen)(),但这对你没有什么好处,因为你仍然需要一个Screen实例(或其中的派生)在调用时连接到它。你的 intent 并不完全清楚(为什么你觉得你首先需要一个指向成员的指针,而不是你的第二个选项,这似乎是你所需要的)。
标签: c++ member-function-pointers member-functions