Anti-Antidote Ответов: 1

Использование векторов для автоматического назначения имен объектов


Ладно, это займет немного объяснений, но я новичок в C++, так что потерпите.

То, что я пытаюсь сделать в своей программе, - это заставить пользователя добавить "элемент" с определенными атрибутами (это мои переменные класса). Каждый раз, когда пользователь добавляет еще один "элемент", я хочу, чтобы программа назначала другой объект в этом формате item[#], где # начинается с 0 и идет оттуда вверх. Я пытался вычислить векторы, и из того, что я видел до сих пор, я добавлю вектор vector<int> item; Когда пользователь добавляет еще один элемент, я хочу, чтобы программа добавила еще одну переменную item# (или похожий, я не совсем уверен) на вектор. Затем вектор назначит объект классу "item", где пользователь будет проходить процесс добавления атрибутов.

Опять же, я не уверен точно, насколько хорошо я объяснил это, поэтому, если я сделал ужасную работу, пожалуйста, скажите мне, почему я сделал это вместо того, чтобы опускать голос и ничего не говорить, так как мне нужно иметь возможность действительно задавать вопросы здесь :)

EDIT: вот пример того, что я пытаюсь сделать
#include <iostream>
#include <vector>
using namespace std;

class item
{
    public:
        string name;
        string icon;
        //etc.
}

int main()
{
    vector<int> itemVec;
    itemVec.insert(itemVec.end, #) //# will be a variable containing the number of items created by user
    item itemVec[#] //# would be the latest vector item created
    //other content

    return 0;
}


Существует класс "предмет" с определенными деталями.
Когда пользователь создает новый элемент, я хочу, чтобы новый объект был создан в формате ' item#', где # - это следующее число в последовательности элементов (начиная с 0)
Я рассматриваю возможность использования вектора, чтобы помочь в этом процессе. Если я не использовал его правильно, Пожалуйста, дайте мне знать :)
ELI5, пожалуйста.

Что сработало для меня

Итак, после многих часов жарких дискуссий эти замечательные люди наконец-то просверлили мне мозговой череп, что тип в std::vector<type> v не должно было быть int или string или еще что-нибудь. Его можно использовать для класса. @Phillippe Mori был тем, кто, наконец, достучался до меня, что именно так все и было:
item my_item; // variable used to create items
vector<item> items; // will hold all added items
items.push_back(my_item); // add item 0
items.push_back(my_item); // add item 1
items.push_back(my_item); // add item 2

string item1name = item[1].name; // Example of accessing item #1

Спасибо всем!
- Анти-Антидот

Что я уже пробовал:

Я долго искал ответ на этот вопрос, но нигде, кажется, нет ответа. Массивы не работают, так как мне нужно, чтобы они могли расширяться в соответствии с потребностями пользователя.

jeron1

Вы хотите, чтобы пользователь вводил данные, затем создавал объект, содержащий эти данные, а затем добавлял объект в вектор этих объектов?

Anti-Antidote

Я хочу, чтобы у пользователя была возможность создать новый "элемент", который создает новый объект "item#" в классе "item". Мне нужна возможность добавить неизвестное количество объектов " item#", так как пользователь может создать много "элементов" или, возможно, только два или три.

Philippe Mori

Я опускаю ваш вопрос, так как вы не предоставляете код, и поэтому очень трудно понять, что вы пытаетесь сделать...

Я мог бы догадаться, что item[#] был бы предмет на этой позиции в vector но в чем же проблема (или вопрос)?

Вы можете добавить элемент в vector по телефону push_back функция-член.

Мы понятия не имеем, как вы собираетесь использовать название товара. Вам нужно только получить элемент по индексу или вы должны быть в состоянии найти имя элемента данного элемента?

Anti-Antidote

Я предоставил код, чтобы помочь вам понять, а также пошаговый процесс для дальнейшего объяснения. Если мне нужно что-то отредактировать, пожалуйста, скажите мне! Спасибо

Philippe Mori

Какова цель itemVec Очевидно, что если вы не удаляете элементы, то содержимое этого вектора всегда будет 0, 1, 2, 3, 4, 5... до количества добавленных элементов минус один (или быть пустым, если элементы еще не были добавлены).

Таким образом, вы, вероятно, хотите использовать вектор элементов.

item my_item; // variable used to create items
vector<item> items; // will hold all added items
items.push_back(my_item); // add item 0
items.push_back(my_item); // add item 1
items.push_back(my_item); // add item 2

string item1name = item[1].name; // Example of accessing item #1

Anti-Antidote

Я не слишком много знаю о векторах, но я надеялся использовать его скорее как индекс, чем как место для деталей (для этого и был создан класс). Затем я бы создал имена объектов, используя индекс. Таким образом, я мог бы иметь неизвестное количество элементов без явного определения.

Philippe Mori

Вероятно, вам все равно нужно сохранить детали... Если вы никогда не удаляете элементы и можете получить доступ к элементам по их индексу,то вектор элементов является адекватным.
Если элементы могут быть удалены или вам нужен эффективный способ получить "индекс" из элемента, то вам может понадобиться что-то еще.
Но мы не можем догадаться по той небольшой информации, которую вы предоставляете...

Anti-Antidote

Я записываю детали элементов в файл Lua в определенном формате. Все, что я делаю здесь, - это получаю информацию от пользователя, обрабатываю ее, а затем записываю в файл. У меня просто проблема с неизвестным количеством предметов. Я подумал, что, поскольку векторы могут быть расширены или сжаты, я мог бы использовать его в качестве индекса для автоматического объявления объектов.

Правка: теперь я понимаю, о чем вы говорите. Я не знал, что вы можете определить T как один из ваших собственных классов :P спасибо!

Anti-Antidote

Можете ли вы получить доступ к вектору изнутри функций, если вектор находится в основной функции? Если да, то как?

Philippe Mori

Передайте ссылку на него.

Anti-Antidote

Что означает?.. Извините, но я еще не очень опытен :)

EDIT: Nvm, нашел его

Patrice T

Можете ли вы подробно рассказать о проблеме, которую пытаетесь решить ?
Вопрос выглядит как неправильное решение другой проблемы.

1 Ответов

Рейтинг:
12

Richard MacCutchan

Вам, скорее всего, нужен лучший вектор, чем vector<int></int>, так как вам нужно хранить детали объекта, а не только его индекс. Какую информацию пользователь предоставляет по запросу? Если это имя класса, то вы можете сразу же создать объект этого класса и добавить его в вектор с некоторой дополнительной информацией, чтобы точно определить, какой это класс. Возможно, какой-то другой тип коллекции был бы лучше, чем простой вектор, или вы могли бы использовать парная структура[^] в векторе. Я думаю, что ваш вопрос нуждается в немного большей детализации относительно того, что именно представляют собой эти "предметы".


Anti-Antidote

Я использую сведения о классе объекта для хранения информации, мне просто нужен способ последовательного создания объектов в форме "item#" или аналогичной, где # - это количество объектов, созданных до создания объекта.

Richard MacCutchan

Почему вы делаете его более сложным, чем это должно быть? Вы можете хранить каждый новый элемент в векторе (vector<item>), а затем может читать, изменять, обновлять, сохранять их по мере необходимости.

Anti-Antidote

Разве я не должен определить этот тип как int?

Richard MacCutchan

Нет, объявите его как содержащий класс объектов, которые вы создаете. вам нужно пойти и перечитать документацию по классу vector.