【问题标题】:How to add to object array pointer c++如何添加到对象数组指针c ++
【发布时间】:2014-08-19 20:06:44
【问题描述】:

我正在尝试将对象添加到作为参数传递的对象数组中。具体来说,我有一个按钮数组,我正在向按钮数组添加一个后退按钮。我怎样才能正确地做到这一点?当我尝试下面的代码时,从原始指针数组传递的按钮出现了一些奇怪的故障。

int createMenu(Button buttons[], int size)
{
    //Stuff here
}

int menu(Button buttons[], int size, bool back)
{
    Button * newButtons[size + 1];
    for (int i = 1; i <= size; i++)
        *newButtons[i] = buttons[i];
    Button back(25, 19, "Back"); //Creates back button object
    *newButtons[0] = back;
    return createMenu(*newButtons, size + 1);
    //Makes menu with the back button
}

感谢任何帮助。

【问题讨论】:

  • 有必要使用数组吗?通常避免使用它们并使用向量。
  • 我从来没有看过他们。它们会或多或少地占用大量内存吗?我在具有 3MB RAM 的设备上运行它。
  • 是的,它们会比数组消耗更多的内存。我猜可能在您的情况下使用数组是有意义的。
  • 显示createMenu的声明
  • BTW 数组的大小必须在编译时已知。 Button *newButtons[size+1]; 是非法的(尽管一些编译器将其作为扩展提供)。此外,无法在运行时调整它们的大小。

标签: c++ arrays class pointers object


【解决方案1】:

在您的循环中,您引用了超出其界限的按钮[大小]。您还可以取消引用 newButtons 的成员而不初始化它们。当它需要一个按钮数组时,您尝试传递createMenu 一个指针数组。应该是这样的:

int menu(Button buttons[], int size, bool back)
{
    Button * newButtons = new Button[size + 1];
    for (int i = 0; i < size; i++)
        newButtons[i + 1] = buttons[i];
    newButtons[0] = Button(25, 19, "Back");
    int result = createMenu(newButtons, size + 1);
    delete [] newButtons;
    return result;
}

【讨论】:

  • delete newButtons; 应该是delete [] newButtons;
【解决方案2】:

作为参考,如果您使用矢量,以下是它的外观:

int menu( std::vector<Button> buttons )
{
    buttons.push_back( Button(25, 19, "Back") );
    return createMenu( buttons );
}

如果确实需要在前面按下按钮,那么有多种选择(例如,实际上将它推到前面;或者使用双端队列而不是向量)。

【讨论】:

    【解决方案3】:

    试试这个。您正在使用 Button*,因此请传递 Button 对象的地址。

    int menu(Button buttons[], int size, bool back)
    {
    
        Button ** newButtons = new Button*[size + 1];
    for (int i = 1; i <= size; i++)
            newButtons[i] = &buttons[i];
        Button * back = new Button(9,11,"fdf"); //Creates back button object
        newButtons[0] = back;
    
        //Makes menu with the back button
    createMenu(*newButtons, size+1);
    }
    
    void createMenu(Button buttons[], int size)
    {
        (buttons[0]).foo();
    
        //Stuff here
    }
    

    此外,您使用相同的变量名“back”作为布尔值和 Button 类的对象。改变它。

    【讨论】:

    • 我仍然得到奇怪的结果。也许这与我的编译器有关。
    • 这里存储了一个局部变量的地址
    • @MattMcNabb,谢谢!这是不可原谅的。
    • 我仍然没有得到预期的结果。但看起来你的答案应该有效。
    • 现在可以编译了吗?你得到什么错误?
    猜你喜欢
    • 2020-07-07
    • 2015-12-02
    • 2018-04-10
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多