Перейти к содержимому

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

  • автор:

Как создать массив объектов класса и обращаться к их методам? C# [дубликат]

И вот есть в этом классе метод Info. И мне нужно обратиться к нему через какой-нибудь элемент массива так:

arr[0].Info(); 

Но компилятор выдаёт ошибку «Ссылка на объект не указывает на экземпляр объекта». И как мне быть? Подскажите, какие варианты обхода этой ошибки есть. Мне нужен именно массив объектов.

Отслеживать
задан 25 мая 2019 в 13:01
Арсений Кривецкий Арсений Кривецкий
49 2 2 серебряных знака 8 8 бронзовых знаков
arr[0] = new MyClass(); arr[0].Info();
25 мая 2019 в 13:02
А точно, спасибо большое.
25 мая 2019 в 13:05

создать массив — это как купить гостиницу без жильцов. Место есть, а жильцов нет. Чтобы они там появились, надо их туда поселить. Вот я в примере выше в комнату номер 0 поселил экземпляр класса MyClass , а потом уже обратился к нему по номеру комнаты и вызвал метод Info()

25 мая 2019 в 13:05

Ещё одна проблемка есть. В классе у меня есть свойство, в виде массива: public double[] weights < get; set; >; И когда я обращаюсь к нему вот так: arr[0].weights[0] = 3.4; Выкидывает ту же самую ошибку.

25 мая 2019 в 13:22
public double[] weights < get; set; >= new double[/*нужное вам количество*/];
25 мая 2019 в 13:24

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Проьблема с созданием массива рещается так

arr[0] = new MyClass(); arr[0].Info(); 

создать массив — это как купить гостиницу без жильцов. Место есть, а жильцов нет. Чтобы они там появились, надо их туда поселить. Вот я в примере выше в комнату номер 0 поселил экземпляр класса MyClass , а потом уже обратился к нему по номеру комнаты и вызвал метод Info()

Проблема с инициализацией поля так

public class MyClass < public double[] weights < get; set; >= new double[10]; > 
public class MyClass < public double[] weights < get; set;>public MyClass() < weights = new double[10]; >> 

Где вместо 10 указываете нужное вам количество.

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

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

Вопрос

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

Массив объектов с конструктором без аргументов создать довольно просто:

А как сделать массив объектов с конструктором, у которого есть аргументы?

Ответ

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

// Ручное создание массива объектов в C++

// Выделяется память для объектов класса Foo в количестве count
Foo *foos = (Foo*)operator new( sizeof( Foo ) * count ) );

// Создаются элементы массива (объекты) с нужными начальными аргументами
for(int i=0; i new( &foos[ i ] ) Foo( a, b );

// Удаление элементов
for( int i = 0; i < count; ++i )
foos[ i ].~Foo();

// И удаление начального указателя
operator delete( foos );

В этом примере продемонстрированы основные действия по созданию массива объектов с аргументами в конструкторе — от создания массива до удаления.

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

Можно создавать массивы объектов точно так же, как создаются массивы данных других типов. Например, следующая программа создает класс display, содержащий информацию о различных адаптерах дисплеев, которые могут быть подключены к PC. В частности, он содержит число цве­тов, которые могут быть получены, и тип видеоадаптера. В функции main() создается массив из трех объектов display. Доступ к элементам этого массива осуществляется с помощью обычной процедуры с использованием индексов.

// пример массива объектов
#include
enum disp_type ;
class display int colors; // число цветов enum
disp_type dt; // тип дисплея
public:
void set_colors(int num)
int get_colors()
void set_type (enum disp_type t)
enum disp_type get_type()
>;
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 cout cout >
return 0;
>

Эта программа выводит на экран следующий текст:

mono has 1 colors
cga has 4 colors
ega has 16 colors

Хотя это и не относится специально к массивам объектов, обратим внимание, каким образом двумерный символьный массив names использован для преобразования перечисляемых значений к их строковым эквивалентам. Для всех переменных перечисляемого типа, не содержащих явной инициализации, первая константа имеет значение 0, вторая 1 и т. д. Поэтому возвращаемое фун­кцией get_type() значение может быть использовано для индексации массива names, что позволя­ет вывести подходящее имя.

Многомерные массивы объектов индексируются в точности так же, как и массивы любых дру­гих типов данных.

  • Инициализация массивов объектов
  • Создание инициализированных и неинициализированных массивов

C++. Массивы объектов в классах. Примеры. Массивы объектов в unmanaged и managed классах. Массив unmanaged (*) указателей на объект класса

Массивы объектов в классах. Примеры. Массивы объектов в unmanaged и managed классах. Массив unmanaged ( * ) указателей на объект класса

Поиск на других ресурсах:

1. Пример использования массива объектов в неуправляемом ( unmanaged ) классе

Задан класс CMyPoint , реализующий точку на координатной плоскости. Также задан класс CPolygon , реализующий ломаную линию. В классе CPolygon объявляется массив из 10 объектов типа CMyPoint .
Реализация класса CMyPoint :

// класс описывает точку на координатной плоскости class CMyPoint < int x, y; public: // конструктор класса CMyPoint(void) < x = y = 0; >// методы доступа int GetX(void) < return x; > int GetY(void) < return y; > void SetXY(int nx, int ny) < x = nx; y = ny; >>;

Реализация класса CPolygon

// класс, который описывает ломаную линию class CPolygon < int n; // количество точек CMyPoint cp[10]; // массив точек public: // конструктор класса CPolygon(void) < n = 0; >// методы доступа CMyPoint GetPoint(int index) < return cp[index]; > // устанавливает новое значение заданной точки void SetPoint(int index, CMyPoint & pt) < if (index>=n) return; cp[index] = pt; > // добавляет точку к ломаной void AddPoint(CMyPoint pt) < if (n<10) n++; else return; cp[n-1] = pt; > // определяет длину ломаной double Length(void) < double len, t; int x1, y1, x2, y2; len = 0; for (int i=0; i return len; > >;

Демонстрация использования классов CPolygon и CMyPoint в некотором методе

// демонстрация использования класса CPolygon CPolygon p1; CMyPoint pt1; // сформировать ломаную с координатами (1; 2), (3; 4), (5;6) pt1.SetXY(1, 2); p1.AddPoint(pt1); pt1.SetXY(3, 4); p1.AddPoint(pt1); pt1.SetXY(5, 6); p1.AddPoint(pt1); // проверка int x, y; CMyPoint pt2; pt2 = p1.GetPoint(0); x = pt2.GetX(); // x = 1 y = pt2.GetY(); // y = 2 pt2 = p1.GetPoint(1); x = pt2.GetX(); // x = 3 y = pt2.GetY(); // y = 4 // длина ломаной double d = p1.Length(); // d = 5.6568. 
2. Пример использования массива объектов в управляемом ( managed ) классе

Реализация класса CMyPoint

// класс, который описывает точку на координатной плоскости ref class CMyPoint < int x, y; public: // конструктор класса CMyPoint(void) < x = y = 0; >// методы доступа int GetX() < return x; > int GetY() < return y; > void SetXY(int nx, int ny) < x = nx; y = ny; >>;

Реализация класса CPolygon

// класс, который описывает многоугольник ref class CPolygon < int n; // количество точек в многоугольнике array ^mp; // массив точек CMyPoint public: // конструктор без параметров CPolygon(void); // конструктор с 2 параметрами, которые получает массив точек CMyPoint CPolygon::CPolygon(int n, array ^mp2); // методы доступа CMyPoint^ GetPoint(int index); // возвращает точку void AddPoint(int nx, int ny); // добавляет точку к ломаной double Length(void); // определяет длину ломаной >; // конструктор класса CPolygon::CPolygon(void) < n = 0; // выделить память - только 1 раз // для массива в целом mp = gcnew array (10); // для каждого элемента массива for (int i=0; igcnew CMyPoint; > // конструктор с 2 параметрами - инициализируется массивом значений CPolygon::CPolygon(int n, array ^mp2) < if (n>10) return; this->n = n; // присвоить массив mp = mp2 for (int i=0; i > // методы доступа // взять точку с заданным индексом CMyPoint^ CPolygon::GetPoint(int index) < return mp[index]; > // добавить точку к ломанной void CPolygon::AddPoint(int nx, int ny) < n++; mp[n-1]->SetXY(nx, ny); > // определить длину ломаной double CPolygon::Length(void) < int x1, y1, x2, y2; double len, t; CMyPoint^ pt; len = 0; // длина ломаной for (int i=0; iGetX(); y1 = mp[i]->GetY(); x2 = mp[i+1]->GetX(); y2 = mp[i+1]->GetY(); t = System::Math::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); len += t; > return len; >

Демонстрация использования классов в другом программном коде

// демонстрация использования класса CPolygon CPolygon^ cp; cp = gcnew CPolygon; // сформировать ломанную с координатами (1;2), (3;4), (5;6) cp->AddPoint(1, 2); cp->AddPoint(3, 4); cp->AddPoint(5, 6); // проверка int x, y; CMyPoint^ pt = gcnew CMyPoint; pt = cp->GetPoint(0); x = pt->GetX(); // x = 1 y = pt->GetY(); // y = 2 pt = cp->GetPoint(1); x = pt->GetX(); // x = 3 y = pt->GetY(); // y = 4 // определить длину ломаной double d; d = cp->Length(); // d = 5.6568. 
3. Пример использования массива unmanaged -указателей на объект класса

Реализация класса CMyPoint

class CMyPoint < int x, y; public: // конструктор CMyPoint::CMyPoint(void) < x = y = 0; >// методы доступа int GetX(void) < return x; > int GetY(void) < return y; > void SetXY(int x, int y) < this->x = x; this->y = y; > >;

Реализация класса CPolygon

// класс, который описывает ломаную линию class CPolygon < int n; CMyPoint * mp[10]; // массив указателей на CMyPoint public: // конструктор CPolygon(void) < n = 0; // выделение памяти - только один раз for (int i=0; inew CMyPoint; > > // методы доступа CMyPoint GetPoint(int index) < return *mp[index]; > void SetPoint(int index, CMyPoint& p) < int x, y; x = p.GetX(); y = p.GetY(); mp[index]->SetXY(x, y); > // добавить новую точку void AddPoint(int x, int y) < mp[n++]->SetXY(x, y); > // вычисление длины ломаной double Length(void) < double len, t; int x1, y1, x2, y2; len = 0; for (int i=0; iGetX(); y1 = mp[i]->GetY(); x2 = mp[i+1]->GetX(); y2 = mp[i+1]->GetY(); t = System::Math::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); len = len + t; > return len; > >;

Фрагмент метода, который демонстрирует использование класса CPolygon

// демонстрация использования массива unmanaged-указателей на объект класса CPolygon cp; // объект класса // сформировать ломаную из трех точек cp.AddPoint(1, 2); cp.AddPoint(3, 4); cp.AddPoint(5, 6); // проверка int x, y; CMyPoint mp; mp = cp.GetPoint(0); x = mp.GetX(); // x = 1 y = mp.GetY(); // y = 2 // определение длины ломаной double d; d = cp.Length(); // d = 5.6568. 

Связанные темы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *