Введение в язык Си++



             

Вектора Объектов Класса


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

table tblvec[10];

будет ошибкой, так как для table::table() требуется целый параметр. Нет способа задать параметры конструктора в описании вектора. Чтобы можно было описывать вектор таблиц table, можно модифицировать описание table () например так:

class table { // ... void init(int sz); // как старый конструктор public: table(int sz) // как раньше, но без по умолчанию { init(sz); } table() // по умолчанию { init(15); } }

Когда вектор уничтожается, деструктор должен вызываться для каждого элемента этого вектора. Для векторов, которые не были размещены с помощью new, это делается неявно. Однако для векторов в свободной памяти это не может быть сделано неявно, поскольку компилятор не может отличить указатель на один объект от указателя на первый элемент вектора объектов. Например:

void f() { table* t1 = new table; table* t2 = new table[10]; delete t1; // одна таблица delete t2; // неприятность: 10 таблиц }

В этом случае длину вектора должен задавать программист:

void g(int sz) { table* t1 = new table; table* t2 = new table[sz]; delete t1; delete[] t2; }

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




Содержание  Назад  Вперед