Create an array of class objs
Now I want to create array of 50 objects of class test . I cannot change class test.
Objects can be created on heap or stack.
Creating objs on stack is not possible in this case since we dont have default constructor in class
Now we may think of creating objs on heap like this..
I dont want to use malloc .Is there any other way??
If you guys can think of some more solutions , please post them.
6 Answers 6
You cannot create an array of objects, as in Foo foo [N], without a default constructor. It’s part of the language spec.
Either do:
You don’t need malloc(). You can just declare an array of pointers.
But you probably ought to have some sort of automatic RAII-type destruction attached.
OR subclass test publicly:
You can treat every TempTest object as a test object.
Note: operator=() & copy constructor are not inherited, so respecify as necessary.
Why do you need array?
Or as @j_random_hacker suggested in the comments:
Contrary to what many people believe, you can actually create an array of objects that do not have a default constructor. What you cannot do is make it use a set of arguments for all constructor invokations. You just have to initialize all elements of it. That is, you can do the following:
That will initialize all 50 elements with 1. boost::pp is used to print a 1 50 times in a row automatically.
![]()
I think that other responders are treating this question too literally.
If all you really want to do is make a «group» of 50 objects that you can treat as an array, then by far the easiest and most maintainable way of accomplishing what you’re trying to do is:
This declares a vector of 50 objects, each of which is a copy of test(1) . A vector is basically a C++ growable array; although you may not need the growability, the fact that it can be called with a 2-arg constructor that copy-constructs each element is useful here.
C# program to create an array of objects

In this post, we will learn how to create an array of objects in C#. We will create a class and an array. This array will hold different objects of the class. We will also learn how to access any of the objects in this array.
Class and objects:
A class is a skeleton or it defines the structure. You can also think it like a blueprint. We can create different objects with different properties for a single class.
Let’s take a look at the below program:
- We have two classes here. The Program class is the main class. If you run this program, it will run the Main method in this class.
- Message class is used to hold a string.
- Inside Main method, we are creating two objects of the Message class. Both of these objects are created with different strings.
- We are calling PrintMsg method on these objects. This method prints the string that is assigned to the object while creating.
If you run the above program, it will print the below two lines:
Array of objects:
We can also create an array of objects as like below:
Here, we created one array with three objects Msg1, Msg2 and Msg3.
Another way to create an object array:
We can also create an empty array first and assign the objects for each index separately. For example:
The index of array starts from 0 and it ends at length — 1. So, we can assign the values by using the indices.
Массивы объектов
Можно создавать массивы объектов точно так же, как создаются массивы данных других типов. Например, следующая программа создает класс display, содержащий информацию о различных адаптерах дисплеев, которые могут быть подключены к PC. В частности, он содержит число цветов, которые могут быть получены, и тип видеоадаптера. В функции main() создается массив из трех объектов display. Доступ к элементам этого массива осуществляется с помощью обычной процедуры с использованием индексов.
// пример массива объектов
#include <iostream.h>
enum disp_type
class display <
int colors; // число цветов enum
disp_type dt; // тип дисплея
public:
void set_colors(int num)
void set_type (enum disp_type t)
>;
char names [4 ] [5] = <
«mono»,
«cga»,
«ega»,
«vga»
>;
int main()
<
display monitors [3];
register int i;
monitors[0].set_type(mono);
monitors[0].set_colors(1);
monitors[1].set_type(cga);
monitors [1] .set_colors(4);
monitors[2].set_type(ega);
monitors [2] .set_colors(16);
for (1=0; i<3; i++) <
cout << names[monitors[i].get_type()] << » «;
cout << «has » << monitors[i].get_colors();
cout << » colors» << «\n»;
>
return 0;
>
Эта программа выводит на экран следующий текст:
mono has 1 colors
cga has 4 colors
ega has 16 colors
Хотя это и не относится специально к массивам объектов, обратим внимание, каким образом двумерный символьный массив names использован для преобразования перечисляемых значений к их строковым эквивалентам. Для всех переменных перечисляемого типа, не содержащих явной инициализации, первая константа имеет значение 0, вторая 1 и т. д. Поэтому возвращаемое функцией get_type() значение может быть использовано для индексации массива names, что позволяет вывести подходящее имя.
Многомерные массивы объектов индексируются в точности так же, как и массивы любых других типов данных.
14.4. Массивы и векторы объектов
Массив объектов класса определяется точно так же, как массив элементов встроенного типа. Например:
Account table[ 16 ];
определяет массив из 16 объектов Account. Каждый элемент по очереди инициализируется конструктором по умолчанию. Можно и явно передать конструкторам аргументы внутри заключенного в фигурные скобки списка инициализации массива. Строка:
определяет массив из трех элементов, инициализируемых конструкторами:
Account( «Piglet», 0.0 ); // первый элемент (Пятачок)
Account( «Eeyore», 0.0 ); // второй элемент (Иа-Иа)
Account( «Tigger», 0.0 ); // третий элемент (Тигра)
Один аргумент можно задать явно, как в примере выше. Если же необходимо передать несколько аргументов, то придется воспользоваться явным вызовом конструктора:
Account( «Piglet», 1000.0 ),
Account( «Eeyore», 1000.0 ),
Account( «Tigger», 1000.0 )
Чтобы включить в список инициализации массива конструктор по умолчанию, мы употребляем явный вызов с пустым списком параметров:
Account( «Woozle», 10.0 ), // Бука
Account( «Heffalump», 10.0 ), // Слонопотам
Эквивалентный массив из трех элементов можно объявить и так:
Account( «Woozle», 10.0 ),
Account( «Heffalump», 10.0 )
Таким образом, члены списка инициализации последовательно используются для заполнения очередного элемента массива. Те элементы, для которых явные аргументы не заданы, инициализируются конструктором по умолчанию. Если его нет, то в списке должны быть заданы аргументы конструктора для каждого элемента массива.
Доступ к отдельным элементам массива объектов производится с помощью оператора взятия индекса, как и для массива элементов любого из встроенных типов. Например:
обращается к Piglet, а
к Eeyore и т.д. Для доступа к членам объекта, находящегося в некотором элементе массива, мы сочетаем операторы взятия индекса и доступа к членам:
Не существует способа явно указать начальные значения элементов массива, память для которого выделена из хипа. Если класс поддерживает создание динамических массивов с помощью оператора new, он должен либо иметь конструктор по умолчанию, либо не иметь никаких конструкторов. На практике почти у всех классов есть такой конструктор.
Account *pact = new Account[ 10 ];
создает в памяти, выделенной из хипа, массив из десяти объектов класса Account, причем каждый инициализируется конструктором по умолчанию.
Чтобы уничтожить массив, адресованный указателем pact, необходимо применить оператор delete. Однако написать
// увы! это не совсем правильно
недостаточно, так как pact при этом не идентифицируется как массив объектов. В результате деструктор класса Account применяется лишь к первому элементу массива. Чтобы применить его к каждому элементу, мы должны включить пустую пару скобок между оператором delete и адресом удаляемого объекта:
// показывает, что pact адресует массив
Пустая пара скобок говорит о том, что pact адресует именно массив. Компилятор определяет, сколько в нем элементов, и применяет деструктор к каждому из них.
14.4.1. Инициализация массива, распределенного из хипа A
По умолчанию инициализация массива объектов, распределенного из хипа, проходит в два этапа: выделение памяти для массива, к каждому элементу которого применяется конструктор по умолчанию, если он определен, и последующее присваивание значения каждому элементу.
Чтобы свести инициализацию к одному шагу, программист должен вмешаться и поддержать следующую семантику: задать начальные значения для всех или некоторых элементов массива и гарантировать применение конструктора по умолчанию для тех элементов, начальные значения которых не заданы. Ниже приведено одно из возможных программных решений, где используется оператор размещения new:
typedef pairchar*, double
* объявлена как статическая функция-член
* обеспечивает выделение памяти из хипа и инициализацию
* init_values: пары начальных значений элементов массива
* elem_count: число элементов в массиве
* если 0, то размером массива считается размер вектора
vectorvalue_pair ::size_type elem_count = 0 )
if ( vec_size == 0 && elem_count == 0 )
// размер массива равен либо elem_count,
// либо, если elem_count == 0, размеру вектора .
size_t elems = elem_count
// получить блок памяти для размещения массива
char *p = new char[sizeof(Account)*elems];
// по отдельности инициализировать каждый элемент массива
int offset = sizeof( Account );
for ( int ix = 0; ix elems; ++ix )
// смещение ix-ого элемента
// если пара начальных значений задана,
// передать ее конструктору;
// в противном случае вызвать конструктор по умолчанию
if ( ix vec_size )
new( p+offset*ix ) Account( init_values[ix].first,
else new( p+offset*ix ) Account;
// отлично: элементы распределены и инициализированы;
// вернуть указатель на первый элемент
Необходимо заранее выделить блок памяти, достаточный для хранения запрошенного массива, как массив байт, чтобы избежать применения к каждому элементу конструктора по умолчанию. Это делается в такой инструкции:
char *p = new char[sizeof(Account)*elems];
Далее программа в цикле обходит этот блок, присваивая на каждой итерации переменной p адрес следующего элемента и вызывая либо конструктор с двумя параметрами, если задана пара начальных значений, либо конструктор по умолчанию:
for ( int ix = 0; ix
В разделе 14.3 говорилось, что оператор размещения new позволяет применить конструктор класса к уже выделенной области памяти. В данном случае мы используем new для поочередного применения конструктора класса Account к каждому из выделенных элементов массива. Поскольку при создании инициализированного массива мы подменили стандартный механизм выделения памяти, то должны сами позаботиться о ее освобождении. Оператор delete работать не будет:
Почему? Потому что ps (мы предполагаем, что эта переменная была инициализирована вызовом init_heap_array()) указывает на блок памяти, полученный не с помощью стандартного оператора new, поэтому число элементов в массиве компилятору неизвестно. Так что всю работу придется сделать самим:
dealloc_heap_array( Account *ps, size_t elems )
for ( int ix = 0; ix elems; ++ix )
Если в функции инициализации мы пользовались арифметическими операциями над указателями для доступа к элементам:
new( p+offset*ix ) Account;
то здесь мы обращаемся к ним, задавая индекс в массиве ps:
Хотя и ps, и p адресуют одну и ту же область памяти, ps объявлен как указатель на объект класса Account, а p — как указатель на char. Индексирование p дало бы ix-й байт, а не ix-й объект класса Account. Поскольку с p ассоциирован не тот тип, что нужно, арифметические операции над указателями приходится программировать самостоятельно.
Мы объявляем обе функции статическими членами класса:
typedef pairchar*, double value_pair;
static Account* init_heap_array(
vector value_pair &init_values,
vector value_pair ::size_type elem_count = 0 );
static void dealloc_heap_array( Account*, size_t );
Читайте также
Защита объектов ядра и приватных объектов
Защита объектов ядра и приватных объектов Многие объекты, такие как процессы, потоки или мьютексы, являются объектами ядра (kernel objects). Для получения и установки дескрипторов безопасности ядра используются функции GetKernelObjectsSecurity и SetKernelObjectsSecurity, аналогичные функциям защиты
Массивы
Массивы Массив — это пронумерованный набор переменных (элементов), фактически хранящийся в одной переменной. Доступ к отдельному элементу массива выполняется по его порядковому номеру, называемому индексом. А общее число элементов массива называется его
Массивы
Массивы Массив — это пронумерованный набор переменных (элементов), фактически хранящийся в одной переменной. Доступ к отдельному элементу массива выполняется по его порядковому номеру, называемому индексом. А общее число элементов массива называется его
8.3. Массивы
8.3. Массивы Интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. В других оболочках существуют определенные ограничения на массивы, например, в ksh максимальное число элементов массива ограничено 1024 элементами.Нумерация элементов
Массивы
Массивы СУБД InterBase была одной из первых, в которой появились массивы. Поддержка массивов в базе данных является расширением традиционной реляционной модели. Наличие массивов позволяет упростить работу со множествами данных одного типа.Массив — это совокупность значений
Массивы
Массивы По умолчанию указатели, передаваемые через параметры, полагаются указателями на единичные экземпляры, а не на массивы. Для передачи массива в качестве параметра можно использовать синтаксис С для массивов и/или специальные атрибуты IDL для представления
R.8.2.4 Массивы
R.8.2.4 Массивы В описании T D, в котором D имеет видD1 [ выражение-константа opt ]описывается идентификатор типа "… массив T". Если выражение-константа присутствует (§R.5.19), то оно должно иметь целочисленный тип и значение, большее 0. Это выражение задает число элементов массива.
Массивы
Массивы Массив — это упорядоченная именованная совокупность однотипных значений, к которым можно обращаться по их порядковому номеру (индексу). Для описания массивов в языке Object Pascal используют следующие формы:• array [1..N1] of type — одномерный массив фиксированного размера
МАССИВЫ
МАССИВЫ Вы уже знаете, что массив представляет собой группу элементов одного типа. Когда нам требуется для работы массив, мы сообщаем об этом компилятору при помощи операторов описания. Для создания массива компилятору необходимо знать тип данных и требуемый класс
Массивы
Массивы Во многих отношениях массивы являются простейшей структурой данных. Проще могут быть только такие базовые типы данных, как integer или Boolean. Массив (array) представляет собой последовательный список определенного количества элементов. Все элементы в массиве
Массивы
Массивы Массивы представляют собой простейшую реализацию набора элементов, для которой можно использовать алгоритм последовательного поиска. Возможны два случая: первый — элементы массива расположены в произвольном порядке и второй — элементы отсортированы. Сначала
Массивы
Массивы Предположим, что у нас имеется отсортированный массив. Как было показано ранее, алгоритм последовательного поиска даже при использовании выхода из цикла в случае отсутствия в списке искомого элемента принадлежит к классу O(n). Каким образом можно улучшить
Массивы
Массивы Массив представляет собой набор элементов одного типа, каждый из которых имеет свой номер, называемый индексом (индексов может быть несколько, тогда массив называется многомерным).Массивы в PascalABC.NET делятся на статические и динамические.При выходе за границы
У16.2 Векторы
У16.2 Векторы Напишите класс VECTOR, представляющий числовые вектора (кольцо) с обычными математическими операциями. Сам класс рекурсивно должен относиться к численному типу, допуская вектора векторов. Возможно, для этого вам придется самостоятельно дописать класс NUMERIC (или