Нужно сделать массив уже созданных объектов - PullRequest
1 голос
/ 26 апреля 2011

Я делаю несколько предметов, и мне нужно установить их как взаимодействующие друг с другом.

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

Это заголовок метода для метода setInteractable в Item.

void setInteractable(Item i[]);

Интерактивные элементы хранятся в таком виде:

static Item interactableItems[25];

Это не работает, ошибка возникает после первой фигурной скобки.Как правильно сделать это в C ++?

Ответы [ 5 ]

3 голосов
/ 26 апреля 2011

Вы не хотите хранить объекты в вашем массиве (в противном случае они копируются), но ссылаются на объекты.

Измените хранилище и интерфейс следующим образом:

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

Советую поискать в гугле для:

  • конструктор копирования
  • указатель против объекта против ссылки
1 голос
/ 26 апреля 2011

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);
0 голосов
/ 26 апреля 2011

Я бы предложил использовать один из контейнеров STL. Моя реализация будет продолжаться так:

// Заголовок метода для метода setInteractable

#include <vector>

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

Ваша реализация должна их выборочно помещать Item объекты в векторы перед передачей их в функцию.

Обратитесь к справочному сайту Cplusplus , чтобы узнать больше о контейнерах STL.

0 голосов
/ 26 апреля 2011

Это неправильный синтаксис 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.

0 голосов
/ 26 апреля 2011

Я бы решил проблему так:

Измените метод для работы с одним объектом за раз и зациклите их:

void setInteractable(Item &i);

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

Намного чище иметь дело. Вы можете хранить их в std :: vector внутри Item, и только с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...