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

#c #class #object #runtime

#c #класс #объект #время выполнения

Вопрос:

Допустим, у меня есть класс, который я определил, называется MyClass. Мой метод «main» принимает в качестве аргументов список имен файлов. Каждое имя файла является файлом конфигурации для MyClass, но пользователь программы может иметь столько объектов MyClass, сколько захочет. Если они введут, скажем, 2 имени файла в качестве аргументов моего основного метода, я хотел бы иметь 2 объекта.

Если бы я знал, что пользователь ограничен 2 объектами, я мог бы просто использовать:

 MyClass myclass1;
MyClass myclass2;
  

Однако это не сработало бы, если бы пользователь вместо этого ввел, скажем, 3 или 4 имени файлов. Может ли кто-нибудь мне помочь и предложить метод, который я мог бы использовать для создания нескольких инициализаций класса в зависимости от количества аргументов, заданных моей программе?

Спасибо

Ответ №1:

Используйте std::vector . Пример

 #include <vector>

std::vector<MyClass> vec;
vec.push_back(MyClass());
vec.push_back(MyClass());
vec.push_back(MyClass());
  

После этого вы можете получить доступ к элементам через [] итераторы и и многое другое. В Интернете есть отличные ссылки.

Ответ №2:

Вы могли бы использовать несколько std::vector MyClass экземпляров — тогда вы могли бы создать столько или столько, сколько захотите.

Взгляните, например, на этот учебник (один из многих в Интернете), чтобы начать.

Ответ №3:

Для этого вы должны использовать массивы или векторы:

 vector<MyClass> myclass;

myclass.push_back( ... );  // Make your objects, push them into the vector.
myclass.push_back( ... );
myclass.push_back( ... );
  

И затем вы можете получить к ним доступ, как:

 myclass[0];
myclass[1];

...
  

См. Википедию для получения дополнительной информации и примеров:

http://en.wikipedia.org/wiki/Vector_(C++)#Usage_example

Комментарии:

1. векторы будут работать, массивы не будут, если вы не знаете максимальное количество объектов, и даже тогда это будет расточительно, потому что, если вы можете иметь 100, но используете только 1, вы потратили впустую 99 бит памяти размером с объект.

2. @Joel: я имел в виду динамически распределяемые массивы как via new . Но да, ваша точка зрения справедлива для массивов фиксированного размера.