需要创建一个已经创建的对象数组

Need to make an array of already created objects

本文关键字:创建 对象 数组 一个      更新时间:2023-10-16

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

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中setinteracttable方法的方法头。

void setInteractable(Item i[]);

可交互项的存储方式如下:

static Item interactableItems[25];

这不起作用,错误发生在第一个花括号之后。在c++中正确的方法是什么?

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

改变你的存储和接口:

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

我建议在谷歌上搜索:

  • 拷贝构造函数
  • 指针vs对象vs引用

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);

像这样传递数组初始化是错误的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放在里面。

我会这样解决这个问题:

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

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中,并且只使用那些。

我建议使用STL容器之一。我的实现将这样进行:

//setinteracttable方法的方法头

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

你的实现应该让它们选择性地在将Item对象传递给函数之前将它们推入向量。

请参阅Cplusplus参考网站获取有关STL容器的更多信息。