Использование векторов для автоматического назначения имен объектов
Ладно, это займет немного объяснений, но я новичок в 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
Можете ли вы подробно рассказать о проблеме, которую пытаетесь решить ?
Вопрос выглядит как неправильное решение другой проблемы.