Но как быть, если создается массив объектов (как динамический, так и статический)?
С татическим объектом ты правилно сделал. По иде должны работать два варианта:
Quote
q a[n] = q::q(); //И q b[n] = q::q(x, y);
А с динамичными будит посложнее. Можно использовать принцип map либо vector (Эти классы упрощают работу с динамичным множеством.), используя простые функции создания и освобождения памяти.
Quote
... bool CreateObj(X, Y); bool FreeObj(); ...
Содержания этих функций зависит от того, какой динамичный массив будет использован, map или vector. P.S. Ищи include-файлы с индеитичными именами (map, vector)
Еще подсказочка. Используй эти функции при добавлении(CreateObj) и удалении(FreeObj) из памяти. Таким методом оптимизируешь память, выделяемую для динамичных классов.
______________________________ Я вернулся, и это чудо. ______________________________
vc, ты сначала пойми суть вопроса, а потом пытайся на него ответить. BOOM, я имел ввиду как это сделать стандартными средствами языка, не прибегая к помощи сторонних классов.
Тогда немного по другому, забьем массив из 100 элементов (размер не важен) одинаковыми данными, в цикле , и проверим результат :
Я сейчас таким способом и пользуюсь. Проблема этого способа в том, что при создании массива сначала вызывается конструктор q(), которого в классе может и не быть и тогда будет ошибка (по крайней мере в GCC), а потом в цикле для каждого элемента вызывается деструктор и второй конструктор. Это немного не экономично, так как проще сразу при создании объекта пользоваться тем конструктором, который нужен. Вот я и хотел бы узнать способ, чтобы сразу создавать элементы массива нужным конструктором.
К тому же, если поставить счетчик элементов, то это может привести к вот такому неправильному результату работы программы:
Code
#include <iostream.h>
class q { public: static int y; int a,u; q(){a=0; u=y++;} q(int z,int x){a=z+x; u=y++;} ~q(){y--;} };
int q::y=0;
int main() { int i; q c[10];
for (i=0; i<10; i++)cout << c[i].u << " "; cout << endl; for (i=0; i<10; i++)c[i]=q::q(1,2); for (i=0; i<10; i++)cout << c[i].u << " ";
Вот я и хотел бы узнать способ, чтобы сразу создавать элементы массива нужным конструктором.
Встроенного способа присвоить всему массиву не нулевое значение не существует.
Если попытаться сделать так : q c[2] = { q::q(1,2) };, тогда только 1 элемент примет значение, остальные будут = 0. Если просто q c[2] = { }; , тогда все элементы будут равны 0. Если только q c[2]; , в таком случае данные массива будут не обозначены.
Либо тебе нужно сделать свой класс или темплейт для массивов, либо используй STL, то есть std::fill. Если нет, тогда заполняй массив циклом.