1

我是一名新程序员,试图自学 C++ 和 OOP。现在我正在从事一个具有多个状态的项目,这是我第一次尝试更大的编程任务/挑战。现在我正在尝试处理一个简单的菜单状态类,但我不确定如何设计它来做我想要的。具体来说,我是一名初级程序员,我不确定要使用哪些数据类型或模板。

以下是我想要制作的菜单屏幕类型的简要说明:

我正在尝试制作一个简单的菜单屏幕,其中列出了多个“菜单元素” 。每个“菜单元素”都包含一个字符串(用于显示元素或项目的名称)和一个函数(用于更改状态、屏幕、执行任务等)。- 我想要的菜单系统的另一个“功能”是选择环绕的能力。例如,如果菜单有 3 个项目,我希望用户能够按上下键来切换当前选择的元素,如果用户在最后一个元素(#3)上并再次按下,他们会回滚围绕元素#1。(反之亦然..)

现在,我〜认为〜这将需要我创建一个名为“MenuElement”的新类,以及一个名为“MenuState”的类,它包含并允许用户在特定元素之间切换和选择。

作为一名新的、自学成才的 C++ 程序员,我对一些更高级的容器的经验有限,而且我对简单的 c 样式数组更加熟悉。我对向量有一点经验,对链表、映射和树也有一点了解,但我不确定在这种情况下使用哪种容器类型。我以前见过使用指针创建循环链表的例子,但是这个例子是用 C 语言编写的,看起来有点笨拙。是否有最适合我的问题的特定类型的包含?还是我想多了,我应该选择一个并运行它?

我想我最终可以使用带有一系列条件语句的 MenuElements 数组来启动并运行这个系统。但是,我真的很想学习如何改进我的编程和设计,不仅让我的代码运行得更快,而且让我的代码干净且逻辑结构合理。

4

1 回答 1

2

环绕可以用模算术完成,即给定一个名为idx_活动光标的私有成员索引变量到菜单元素数组中,你可以有一个成员函数page_down()page_up()就像这样

void CompositeMenu::page_down()
{
    // idx_ will always remain in the interval [0, num_elements() )
    // when idx_ equals num_elements() - 1, page_down() will yield 0 (i.e. wrap-around)
    idx_ = (idx_ + 1) % num_elements(); 
}

void CompositeMenu::page_up()
{
    // idx_ will always remain in the interval [0, num_elements() )
    // when idx_ equals 0, page_up() will yield num_elements() - 1 (i.e. wrap-around) 
    idx_ = (idx_ - 1 + num_elements() ) % num_elements() ;
}

num_elements()当前菜单的大小在哪里。

对于您的一般设计问题,您的类层次结构草图将使用复合设计模式维基百科)。这定义了一个抽象的菜单接口,并将其IMenu派生为具体的类。这允许任意级别的嵌套子菜单。CompositeMenuLeafMenu

class IMenu
{
public:
    virtual void SomeOperation() = 0;
};

class CompositeMenu
:
    public IMenu
{
public:
    virtual void SomeOperation() 
    { 
        // your implementation 
    }

    void page_down();  // use implementation above      
    void page_up();    // use implementation above
    int num_elements { return subMenus_.size(); }

private:
    std::vector<IMenu*> subMenus_; // list of subMenus, which can also have nested menus themselves
    int idx_; // active menu element
};

class LeafMenu
:
    public IMenu
{
public:
    virtual void SomeOperation()
    {
        // your implementation
    }
};

请注意,sincenum_elements()是一个允许对子菜单进行动态更新的成员函数(即,它允许拖放菜单项)。

于 2012-09-11T06:10:34.503 回答