gpt4 book ai didi

使用类 T 的 C++ 函数指针

转载 作者:行者123 更新时间:2023-11-28 07:14:51 25 4
gpt4 key购买 nike

<分区>

我正在使用 C++ 和 OpenGL 开发自己的 GUI 框架。我在这两个方面的经验都很少,因为这是我使用它们的第一个项目。

在框架中,我创建了一个窗口,它呈现窗口的设计,然后是作为子窗口添加到窗口的任何对象。

然后我使用继承 self 的窗口类的名为 MainMenu 的新类创建窗口,然后向 MainMenu 添加一个新按钮

使用:

button->SetOnClick(&MainMenu::button_Click, this);

然后我添加一个指向函数的指针,以及按钮“SetOnClick”方法的类的实例 - 因此,如果单击该按钮,MainMenu 中的一个方法将运行。

目前效果很好,但我现在的问题是我想添加一个名为 Settings 的新窗口,它也将从 Window 类继承

因此我需要使按钮类中的函数指针适用于任意数量的类(所有类型为 Window)

这是当前有效的代码 - 但仅适用于 MainMenu(请注意,我删除了很多与问题无关的方法以使其更易于阅读)

窗口.h:

class Window
{
private:
void Initialize(WindowManager* manager, int width, int height);

public:
Window(WindowManager* manager);
Window(WindowManager* manager, int width, int height);
~Window(void);

void Render();
bool MouseMove(int x, int y);
bool MouseLBDown(int x, int y);


Children* Child() { return m_children; };

主菜单.h:

class MainMenu : public ObjWindow
{
private:
void Initialize();
public:
MainMenu(WindowManager* manager, int width, int height) : Window(manager, width, height)
{
Initialize();
};
MainMenu(WindowManager* manager) : Window(manager)
{
Initialize();
};

~MainMenu(void);

void button_Click();

主菜单.cpp:

void MainMenu::Initialize()
{
Button* button = new Button(Vector2D(100, -400), 100, 50);
Child()->Add(button);
button->SetText("Click Me!");

button->SetOnClick(&MainMenu::button_Click, this);
}

void MainMenu::button_Click()
{
//Do some button code
}

按钮.h:

class Button
{
typedef void (MainMenu::*Function)();
Function m_onClickFunction;

MainMenu* m_window;

public:
Button(Vector2D position, int width, int height);
~Button(void);

void SetText(std::string);
std::string GetText();

void Render();
bool MouseMove(int x, int y);
bool MouseLBDown(int x, int y);


void SetOnClick(Function, MainMenu*);

按钮.cpp:

Button::Button(Vector2D position, int width, int height)
{
m_onClickFunction = NULL;
}


Button::~Button(void)
{
}


bool Button::MouseMove(int x, int y)
{

return true;
}

bool Button::MouseLBDown(int x, int y)
{
if (m_body->Intercepts(x,y))
{
if (m_onClickFunction != NULL)
{
(m_window->*m_onClickFunction)();
}
}
return true;
}


void Button::SetOnClick(Function function, MainMenu* window)
{
m_onClickFunction = function;
m_window = window;
}

从互联网上的研究来看,我似乎需要使用一个模板,以便我可以将类作为一种类型来处理,我已经尝试将其融入我的代码,但到目前为止我没有任何效果。

请注意,我也是第一次在 stackoverflow 上提问,所以如果我遗漏了任何重要的事情,请告诉我

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