Как сделать массив объектов класса в c

Добавил пользователь Алексей Ф.
Обновлено: 10.09.2024

class TREE_ELEMENT public:
TREE_ELEMENT ();
void setAll( int, int, int, int, int);
.

int number;
int isa;
int isat;
int partof;
int partoft;

TREE_ELEMENT::TREE_ELEMENT
<>
void TREE_ELEMENT::setAll(int Wnumber = 0, int Wisa = 0, int Wpartof = 0, int Wisat = 0, int Wpartoft =0)
this.number = Wnumber;
this.isa = Wisa;
this.isat = Wisat;
this.partof = Wpartof;
this.partoft = Wpartoft;
>

te[temp_name] = new TREE_ELEMENT();
te[temp_name].setAll(temp_name, isa_name, pof_name, isat_name, poft_name);

Все переменые int

C:\Program Files\Microsoft Visual Studio\MyProjects\result\filewr.cpp(141) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class TREE_ELEMENT *' (or there is no acceptable conversion)
tree.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\result\tree.cpp(10) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

Почему компилятор ругается? Чего ему надо?

Нет, просто создание элементов идет внутри цикла temp_name - константа втечение всей итерации (потом меняется). А с this - попробую переделать (просто в java всегда так делалось. )

Вот этой строчкой

Вы создали не массив объектов, а массив указателей на объекты.

Поэтому, Вы совершенно правильно инициализируете один такой указатель строчкой

te[temp_name] = new TREE_ELEMENT();

она кладёт в него указатель на новосозданный объект.

А вот потом Вы вызываете метод неправильно, Вам надо "разыменовать" указатель, то есть применять не точку, а стрелочку

te[temp_name]->setAll(temp_name, isa_name, pof_name, isat_name, poft_name);

Если хотите точку, то напишите так, это тоже самое

(*te[temp_name]).setAll(temp_name, isa_name, pof_name, isat_name, poft_name);

То есть, сначала нужно получить из указателя сам объект, а потом уже у объекта вызвать метод.

На что ругается компилятор, я не понял, покажите, где строчка номер 141 (число в скобках -- это номер строчки с ошибкой).

Я так понимаю, что где-то Вы присваиваете объекту указатель на объект, но такого места я не вижу (если Вы привели все значимые строки).

1. this - указатель, значит надо this->number
2. в методах класса эл-ты доступны непосредственно: number = xxx

3. что такое temp_name? В вашем тексте он может быть только константой

te[temp_name].setAll(temp_name, isa_name, pof_name, isat_name, poft_name)
если в массиве указатели на экземпляры класса все-таки надо писать te[temp_name]->setAll.

В этом уроке мы научимся работать с массивами. Мы научимся объявлять, инициализировать и получать доступ к элементам массива в программировании на C++ с помощью примеров. В С++ массив – это переменная, которая может хранить несколько значений одного типа.

Например: Предположим, в классе 27 учеников, и нам нужно сохранить оценки всех их. Вместо того, чтобы создавать 27 отдельных переменных, мы можем просто создать массив:

Здесь grade – это массив, который может содержать не более 27 элементов типа double.

В C++ размер и тип массивов не могут быть изменены после его объявления.

Объявление массива

  • int – тип сохраняемого элемента;
  • x – имя массива;
  • 6 – размер массива.

Доступ к элементам в массиве

В C++ каждый элемент массива связан с числом. Число известно, как индекс массива. Мы можем получить доступ к элементам массива, используя эти индексы.

Рассмотрим массив x, который мы видели выше.

Доступ к элементам в массиве

Несколько вещей, которые следует помнить:

  • Индексы массива начинаются с 0. Это означает, что x [0] – это первый элемент, сохраненный с индексом 0.
  • Если размер массива равен n, последний элемент сохраняется по индексу (n-1). В этом примере x [5] – последний элемент.
  • Элементы массива имеют последовательные адреса. Например, предположим, что начальный адрес x [0] – 2120d. Тогда адрес следующего элемента x [1] будет 2124d, адрес x [2] будет 2128d и так далее. Здесь размер каждого элемента увеличивается на 4. Это потому, что размер int равен 4 байтам.

Инициализация

В С++ можно инициализировать массив во время объявления. Например:

Инициализация массива

Другой способ инициализации массива при объявлении:

Здесь мы не упомянули размер массива. В таких случаях компилятор автоматически вычисляет размер.

Массив с пустыми членами

В C++, если массив имеет размер n, мы можем хранить до n элементов в массиве. Однако что произойдет, если мы сохраним менее n элементов.

Здесь массив x имеет размер 6. Однако мы инициализировали его всего тремя элементами.

В таких случаях компилятор присваивает оставшимся местам случайные значения. Часто это случайное значение просто 0.

Массив с пустыми членами

Как вставить и распечатать элементы массива?

Пример 1: отображение элементов

Здесь мы использовали цикл for для итерации от i = 0 до i = 4. На каждой итерации мы выводили числа [i].

Мы снова использовали цикл for на основе диапазона для вывода элементов массива.

Примечание. В нашем цикле на основе диапазона мы использовали код const int n вместо int n в качестве объявления диапазона. Однако более предпочтительным является const int n, потому что:

  1. Использование int n просто копирует элементы массива в переменную n во время каждой итерации. Это неэффективно с точки зрения памяти. n , однако, использует адрес памяти элементов массива для доступа к их данным, не копируя их в новую переменную. Это эффективно с точки зрения памяти.
  2. Мы просто печатаем элементы массива, а не изменяем их. Поэтому мы используем const, чтобы случайно не изменить значения массива.

Пример 2: получение входных данных от пользователя и сохранение их в массиве

И снова мы использовали цикл for для итерации от i = 0 до i = 4. На каждой итерации мы брали ввод от пользователя и сохраняли его в числах [i].

Затем мы использовали другой цикл for для печати всех элементов массива.

Пример 3: отображение суммы и среднего значений элементов, используемых для цикла

В этой программе:

  1. Мы инициализировали двойной массив с именем numbers, но не указали его размер. Мы также объявили три двойных переменных sum , count и average . Здесь sum = 0 и count = 0.
  2. Затем мы использовали цикл for на основе диапазона для печати элементов массива. На каждой итерации цикла мы добавляем текущий элемент массива к sum .
  3. Мы также увеличиваем значение count на 1 на каждой итерации, чтобы мы могли получить размер массива к концу цикла for.
  4. После печати всех элементов мы печатаем сумму и среднее всех чисел. Среднее значение чисел определяется как среднее значение = сумма/количество.

Примечание: мы использовали ранжированный цикл for вместо обычного цикла for.

Обычный цикл for требует, чтобы мы указали количество итераций, которое задается размером массива. Но для цикла с ранжированием такие спецификации не требуются.

Если мы объявим массив размером 10, то массив будет содержать элементы с индекса 0 до 9.

Однако, если мы попытаемся получить доступ к элементу с индексом 10 или более 10, это приведет к неопределенному поведению.

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Объявление массивов и инициализация массивов

Объявление массивов

Массив – это структура данных для хранения элементом определенного типа, имеющая фиксированный размер. Доступ к элементам массива производится по числовому индексу.

Для объявления массива, после указания типа его элементов, ставятся квадратные скобки:

Перед использованием, массив обязательно нужно проинициализировать, это можно сделать сразу, при его объявлении:

Либо после объявления:

Для доступа к элементам массива используются числовые индексы. Значения элементов массива будут равны значению по умолчанию для типа, массив которого был создан.

Например, для указанного выше a3 – это будут нули, так как для типа int значение по умолчанию: 0;

Если попытаться вывести элементы массива na1 :

то приложение не будет собрано, т.к. массив предварительно нужно проинициализировать.

Инициализация массивов

Рассмотрим различные варианты инициализации массива. Как уже было сказано, можно просто указать количество элементов в массиве, при этом его элементам будут присвоены значения по умолчанию:

После объявления массива значения элементам присваиваются через индекс:

Есть возможность задать конкретные значения в момент объявления с использованием ключевого слова new и указанием типа:

Либо без ключевого слова new:

Неявная типизация

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

Либо предоставить возможность “поработать” системе вывода типов:

Доступ к элементам массива. Обход элементов массива.

Как уже было сказано выше, за доступ к элементам массива отвечают числовые индексы:

При этом, если вы укажете индекс больше, чем максимально возможный, то будет выброшено исключение:

Приведенная выше строка приведет к выбросу следующего исключения:

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array .

Обход элементов массива можно производить с помощью циклов for , foreach и while , последний самый неудобный для работы с массивами, его мы рассматривать не будем. Если вы работаете с циклом for , то для указания верхней границы инкрементируемой переменной можно воспользоваться свойством Length у массива:

Более удобным для обхода элементов будет foreach :

Преимущество цикла for состоит в том, что в нем вы можете модифицировать элементы массива:

Передача массива в метод

Массивы являются ссылочным типом данных, это означает, что их значения хранятся в куче, а имя переменной массива является ссылкой на соответствующую область памяти. При передаче массива в качестве аргумента в метод, происходит присваивание значения переменной массива переменной определяющей аргумент, а так как имя массива – это ссылка, то фактически происходит передача ссылки на значение в куче. Поэтому, если вы передали массив в функцию и внутри этой функции произошла модификация этого массива, то исходный массив тоже изменится.

Создадим метода WorkWithArray , который изменяет содержимое массива:

Вызовем его в методе Main :

Ниже приведена иллюстрация того, как массив и ссылки на него располагаются в памяти.

Переменные na5 в методе Main и arr в методе WorkWithArray ссылаются на одну и ту же область памяти в куче, поэтому изменение массива через переменную arr отражается на переменной na5 .

Многомерные массивы

Прямоугольные массивы

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

Рассмотрим на примерах работу с такими массивами:

Зубчатые массивы

В зубчатых массивах элементами верхнего уровня являются другие массивы, это позволяет создавать многомерные структуры, у которых строки имеют разную длину:

Класс System.Array

Свойства класса System.Array

Имя свойства

Назначение

Число элементов в массиве. Учитываются все измерения.

Ранг массива – число измерений.

Методы класса System.Array

Символ * после названия метода означает, что он имеет более одной сигнатуры, за дополнительной информацией обращайтесь к официальной документации.

Имя метода

Назначение

BinarySearch(Array, Object)*

Выполняет поиск элемента в массиве.

Clear(Array, Int32, Int32)

Присваивает значение по умолчанию определенному количеству элементов массива начиная с заданного индекса.

Создает копию массива (неполную).

Copy(Array, Array, Int32)*

Копирует данные из одного массива в другой в заданном количестве.

CopyTo(Array, Int32)*

Копирует элементы из текущего массива в заданный, начиная с указанного индекса.

Exists (T[], Predicate )

Определяет наличие элемента удовлетворяющему предикату.

GetValue(Int32)*

Возвращает значение по указанному индексу.

IndexOf(Array, Object)*

Возвращает индекс первого вхождения элемента в массиве.

Reverse(Array)*

Задает обратный порядок для элементов в массиве.

Сортирует элементы массива.

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

Ниже приведены примеры использования представленных выше методов и свойств класса System.Array :

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Массив – это пронумерованный набор однотипных данных с общим именем. Они позволяют удобно хранить и использовать связанные между собой переменные.

Объявление массива и доступ к его элементам

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

  • type – тип данных, содержащихся в ячейках массива. Это может быть как тип значений, так и ссылочный тип.
  • variable – имя переменной, ссылающейся на массив.
  • length – количество ячеек массива, то есть количество его ячеек.

После того, как массив объявлен, к его элементам можно обращаться в виде имя_масива[индекс].

Как видно из примера, индексация ячеек массива начинается с 0. Соответственно, наибольший индекс массива на единицу меньше его длины. Стоит также отметить, что, в отличие от необходимости присвоения начального значения у обычных переменных, ячейкам массива присваивается некое значение по умолчанию (false для типа bool, 0 для целочисленных типов и т.д.).

Инициализация массива

В предыдущем примере значения элементам массива присваивались после его объявления. Так же, как и переменную, массив можно инициализировать начальными значениями при объявлении. Для этого нужно перечислить присваиваемые данные в фигурных скобках через запятую.

Как показано в примере, инициализация в массиве имеет следующие свойства:

  • § Размер массива в фигурных скобках указывать не обязательно, так как он будет соответствовать количеству инициализирующих значений;
  • § Ключевое слово new и повторное указание типа также можно опустить. Главное добавить квадратные скобки к типу переменной и инициализировать массив соответствующими значениями.

Неявная типизация массива

При неявной типизации компилятор пытается определить тип массива как один из базовых. Если же компилятор не может определить тип данных хоть одного из значений, либо тип не совпадает с остальными значениями, то возникает ошибка.

Массивы объектов

Свойство массива Length

Будучи объектом, массив имеет свойство Length, в котором записана длина массива. Его использование помогает программисту не рыться в коде в поисках объявления и исключить ошибку попытки доступа к ячейке по индексу вне массива.

В примере объявления массива и обращения к его ячейкам мы использовали цикл, вручную задав предельное значение итератора (i

Данный материал был вам полезен?

Не забудьте оставить свой комментарий, а также поблагодарить автора и поддержать его для создания новых полезных материалов

Читайте также: