需要创建已创建对象的数组

时间:2011-04-26 05:06:51

标签: c++ oop pointers reference

我正在制作几个项目,需要将它们设置为可以互相交互。

Item i1 = Item("Item 1");
Item i2 = Item("Item 2");
Item i3 = Item("Item 3");
Item i4 = Item("Item 4");

i1.setInteractable({i2,i3});
i2.setInteractable({i1,i4});
i3.setInteractable({i1});

这是Item中setInteractable方法的方法标题。

void setInteractable(Item i[]);

可互动项目存储如下:

static Item interactableItems[25];

这不起作用,错误发生在第一个大括号之后。在C ++中执行此操作的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

您不希望在数组中存储对象(否则,它们被复制),但是对对象的引用。

更改您的存储和界面:

void setInteractable(Item& i[]);
static Item& interactableItems[25];

我建议在谷歌寻找:

  • 复制构造函数
  • 指针vs对象与参考

答案 1 :(得分:1)

C ++不像您尝试的那样轻松制作动态列表。

要制作动态列表,首先需要声明动态列表:

Item * dlist = new Item[2];

设置它们:

dlist[0] = i1;
dlist[1] = i2;

然后将它们传递给你的函数:

setInteractable(dlist);

最后你必须记住清理你的记忆:

delete [] dlist;

或者......您使用标准模板库执行此操作。

std::vector<Item> temp1;

temp1.push_back(i1);
//... other sets

你的功能应该是:

void setInteractable(std::vector<Item> & list)
{
///
}

电话应该是

setInteractable(temp1);

答案 2 :(得分:0)

我会像这样解决问题:

将方法更改为一次处理一个对象,并循环遍历它们:

void setInteractable(Item &i);

for (int i = 0; i < 25; i++)
   for (int j = i + 1; j < 25; j++)
      items[i].setInteractable(items[j]);

要处理的更干净。您可以将它们存储在Item内部的std :: vector中,并将它们存储在那里。

答案 3 :(得分:0)

传递数组初始化是错误的C ++语法:

i1.setInteractable({i2,i3}); // error: invalid

您可以通过各种方式实现这一目标。最直接的方法是使用std::vector。 首先将interactableItems声明为

static vector<Item> interactableItems;

现在你不需要setInteractable(),如果你在变量public之上 用法:

i1.interactableItems.push_back(Item("Item 2"));
i1.interactableItems.push_back(Item("Item 3"));

如果你想要变量private,那么你可以放一个包装器并将push_back放在其中。

答案 4 :(得分:0)

我建议使用其中一个STL容器。我的实施将如此进行:

// setInteractable方法的方法标题

#include <vector>

class Item {
private:
// some declarations
public:
    void setInteractable(vector<Item &>);
    // some other declarations
};

您的实现应该选择性地Item个对象推送到向量上,然后再将它们传递给函数。

有关STL容器的更多信息,请参阅Cplusplus Reference Site