dirkgently-х изношенном достаточно точное представление массивов элементов в C++, но где он инициализирует все элементы массива с одинаковым значением, похоже, что вы пытаетесь инициализировать каждый с отдельным значением.
Чтобы ответить на ваш вопрос, создайте массив объектов, которые принимают параметр конструктора int. Вы не можете, объекты создаются при распределении массива и при отсутствии тривиального конструктора, который ваш компилятор будет жаловаться. Однако вы можете инициализировать массив указателей на свой объект, но вы действительно получите большую гибкость с вектором, поэтому в моих следующих примерах будет использоваться std :: vector.
Вам нужно будет инициализировать каждый объект отдельно, если вы хотите, чтобы каждый объект имел определенное значение, вы можете сделать это одним из двух способов; в стеке или в куче. Сначала посмотрим на стек.
Любой конструктор, который принимает один аргумент и не помечен как explicit
, может использоваться как неявный конструктор. Это означает, что в любом месте, где ожидается объект такого типа, вы можете вместо этого использовать экземпляр одного типа параметров. В этом примере мы создаем вектор вашего класса Object и добавляем к нему 100 объектов (push_back добавляет элементы в вектор), мы передаем целое число в push_back, который неявно создает объект, передаваемый в целое число.
#include <vector>
int main() {
std::vector<Object> v;
for(int i = 0; i < 100; i++) {
v.push_back(i);
}
}
Или быть явно об этом:
#include <vector>
int main() {
std::vector<Object> v;
for(int i = 0; i < 100; i++) {
v.push_back(Object(i));
}
}
В этих примерах, все объекты объектов выделяются в стеке в объеме для цикла, поэтому копия происходит, когда объект вставляется в вектор. Копирование большого количества объектов может вызвать некоторые проблемы с производительностью, особенно если ваш объект дорог для копирования.
Один из способов обойти эту проблему производительности, чтобы выделить объекты на кучу и хранить указатели на объекты в вашем векторе:
#include <vector>
int main() {
std::vector<Object*> v;
for(int i = 0; i < 100; i++) {
v.push_back(new Object(i));
}
for(int i = 0; i < 100; i++) {
delete v[i];
}
}
Поскольку наши объекты были созданы в куче мы должны убедиться, что мы удаляем их для вызова их деконструктора и, освобождая их память, этот код делает это во втором цикле.
Ручной вызов delete
имеет свои оговорки, если вы передадите эти указатели на другой код, вы можете быстро потерять информацию о том, кто владеет указателями, и кто должен их удалить. Более простой способ решения этой проблемы является использование смарт-указатель для отслеживания срока службы указателя см либо boost::shared_ptr
или tr1::shared_ptr
, которые являются ориентирами подсчетом указатели:
#include <vector>
int main() {
std::vector<shared_ptr<Object> > v;
for(int i = 0; i < 100; i++) {
Object* o = new Object(i);
v.push_back(shared_ptr<Object>(o));
}
}
Вы заметите, что конструктор shared_ptr является явной , это делается намеренно, чтобы убедиться, что разработчик намеренно набивает свой указатель в общий указатель. Когда все ссылки на объект будут выпущены, объект будет автоматически удален с помощью shared_ptr, освободив нас от необходимости беспокоиться о его жизни.
Спасибо за следовать до. Это тоже очень помогло! – banDedo