gpt4 book ai didi

c++ - 类成员函数的堆栈,但该类尚不清楚

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:13 25 4
gpt4 key购买 nike

我有一些棘手的事情要解释,所以我会尽力而为。我有一个 InstructionScreen 类,它显示箭头和文本 block ,解释每个按钮的作用等。所以在 InstructionScreen 中,我有一堆成员函数,每个函数都会创建一些箭头和文本来解释不同按钮的作用。

InstructionScreen 将被子类化为 MenuInstructScreen、OptionsInstructScreen 等。在这些类中,我将创建自定义函数,这些函数将创建箭头和文本来解释它们的屏幕按钮。

问题在于在 InstructionScreen 中声明此堆栈,因为它将包含属于其子类的函数。我想我可以做到这一点,但我使用的模板对吗?

所以简而言之,问题是我如何声明一个堆栈,该堆栈将包含一个尚不存在的类的成员函数?

如果你看这个简单的例子,这个问题就更容易理解了:

typedef class InstructionScreen;
typedef class MenuInstructScreen;
template <typename FooClass>
typedef void (FooClass::*MemberFuncPtr)(); // will be typedef void (MenuInstructScreen::*MemberFuncPtr)();


class InstructionScreen
{
public:
InstructionScreen() {}

void runInstructions()
{
while ( !instructionStep.empty() )
{
(this->*instructionStep.top())();
instructionStep.pop();
}
}

protected:
stack <MemberFuncPtr> instructionStep;
};

class MenuInstructScreen : public InstructionScreen
{
public:
MenuInstructScreen()
{
// Set instruction schedule
instructionStep.push( &MenuInstructScreen::step2() );
instructionStep.push( &MenuInstructScreen::step1() );
}

void step1()
{
// create some widgets that point to buttons & widgets that contain text instructions
}

void step2()
{
// create some widgets that point to buttons & widgets that contain text instructions
}

private:

};

class OptionsInstructScreen : public InstructionScreen
{
public:
OptionsInstructScreen()
{
// Set instruction schedule
instructionStep.push( &OptionsInstructScreen::step2() );
instructionStep.push( &OptionsInstructScreen::step1() );
}

void step1()
{
// create some widgets that point to buttons & widgets that contain text instructions
}

void step2()
{
// create some widgets that point to buttons & widgets that contain text instructions
}

private:

};

最佳答案

C++ 不允许模板化类型定义,但 C++11 通过 Template Aliases 支持这一点.如果您的编译器不支持 C++11,您可以使用类似 Boost.Function 的仿函数来实现相同的目的。 .

typedef boost::function<void()> Func;

由于您的 typedef 用于不带参数的成员函数,因此您可以使用 aboce 定义一个返回 void 且不接受任何参数的仿函数。尽管它不会仅限于特定类(class)的成员。您将使用类似以下内容的派生类将项目插入堆栈:

stack.push(boost::bind(&MenuInstructScreen::step2, this));
stack.push(boost::bind(&MenuInstructScreen::step1, this));

你原来的例子现在看起来像这样......

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <stack>

class InstructionScreen
{
public:
void runInstructions()
{
while (!instructionStep.empty())
{
boost::function<void()> func = instructionStep.top();
instructionStep.pop();

func();
}
}

protected:
std::stack<boost::function<void()> > instructionStep;
};

class MenuInstructScreen : public InstructionScreen
{
public:
MenuInstructScreen()
{
instructionStep.push(boost::bind(&MenuInstructScreen::step2, this));
instructionStep.push(boost::bind(&MenuInstructScreen::step1, this));
}

void step1()
{
//
}

void step2()
{
//
}
};

class OptionsInstructScreen : public InstructionScreen
{
public:
OptionsInstructScreen()
{
instructionStep.push(boost::bind(&OptionsInstructScreen::step2, this));
instructionStep.push(boost::bind(&OptionsInstructScreen::step1, this));
}

void step1()
{
//
}

void step2()
{
//
}

private:

};

int main() { }

关于c++ - 类成员函数的堆栈,但该类尚不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562171/

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