Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2019, 14:57   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
то, что хочешь получить,
Чтобы было максимально понятно что я хочу сделать, набросал пример на delphi. Я знаю, что это совершенно разные языки. Но просто для наглядности.
Код:

type
  TMyClass = class
    public
      constructor Create;
      destructor Destroy; override;
  end;

var
  ar : array of TMyClass;

begin
  SetLength(ar, 3);
  ar[2] := TMyClass.Create;
  ar[0] := TMyClass.Create;
  ar[1] := ar[2];
  ar[0].Free;
  ar[0] := ar[1];
  SetLength(1);
  ar[0].Free;
end.
В С++ нельзя проворачивать подобное?
BLACK_RAIN вне форума Ответить с цитированием
Старый 14.12.2019, 15:04   #12
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
В С++ нельзя проворачивать подобное
можно, это обычный массив вектор. У класса два дополнительных метода - Create и Destroy. Определи их в классе и вызывай точно так же

На мой взгляд, в C++ это организовано гораздо удобнее - конструктор и деструктор вызываются автоматически

Последний раз редактировалось Алексей1153; 14.12.2019 в 15:06.
Алексей1153 вне форума Ответить с цитированием
Старый 14.12.2019, 15:11   #13
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

вот аналогичный код на C++
Код:
	class TMyClass
	{
	public:

		TMyClass()
		{
			Create();
		}
		~TMyClass()
		{
			Destroy();
		}

		void Create()
		{
		}

		void Destroy()
		{
		}
	};

	std::vector<TMyClass> ar;
	ar.resize(3);
	ar[1] = ar[2];
	ar[0]= ar[1];
	ar.resize(1);
но при желании можешь убрать вызов функций внутри конструктора и деструктора и вызывать их вручную
Алексей1153 вне форума Ответить с цитированием
Старый 14.12.2019, 15:17   #14
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
На мой взгляд, в C++ это организовано гораздо удобнее - конструктор и деструктор вызываются автоматически
чем же удобнее, если экземпляр класса нельзя создать и убить в нужный тебе момент?
BLACK_RAIN вне форума Ответить с цитированием
Старый 14.12.2019, 15:29   #15
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Код:
std::vector<TMyClass> ar; 
ar.resize(3);
то есть, при ресайзе в большую сторону новые элементы будут автоматически созданы и к ним сразу можно будет обращаться? А при ресайзе в меньшую, лишние элементы автоматически деструктятся?
BLACK_RAIN вне форума Ответить с цитированием
Старый 14.12.2019, 15:32   #16
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
если экземпляр класса нельзя создать и убить в нужный тебе момент
почему нельзя, можно, массив или вектор указателей (лучше шаред) - и в путь.

Код:
	class TMyClass
	{
	public:
		int val=0;

		TMyClass(int val=0):val(val)
		{
			Create();
		}
		~TMyClass()
		{
			Destroy();
		}

		void Create()
		{
		}

		void Destroy()
		{
		}
	};

	std::vector<std::shared_ptr<TMyClass>> ar;
	ar.resize(3);
	ar[2].reset(new TMyClass);
	ar[0].reset(new TMyClass);
	ar[1].reset(new TMyClass(*ar[2]));

	ar[0].reset(new TMyClass(*ar[1]));

	*ar[0]=TMyClass(0);
	*ar[1]=TMyClass(1);
	*ar[2]=TMyClass(2);
	ar.resize(1);
видно, что без указателей всё несколько проще. Тут выбор зависит от задачи и объёмов массива.

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
то есть, при ресайзе в большую сторону новые элементы будут автоматически созданы и к ним сразу можно будет обращаться? А при ресайзе в меньшую, лишние элементы автоматически деструктятся?
да, вектор обеспечивает это
Алексей1153 вне форума Ответить с цитированием
Старый 14.12.2019, 15:42   #17
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
да, вектор обеспечивает это
тогда в этом коде
Код:


	std::vector<TMyClass> ar;
	ar.resize(3);
	ar[1] = ar[2];
	ar[0]= ar[1];
	ar.resize(1);
нулевой элемент будет мёртв, если я правильно понял
BLACK_RAIN вне форума Ответить с цитированием
Старый 14.12.2019, 15:51   #18
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
нулевой элемент будет мёртв
почему? После resize(3) у нас три элемента. После resize(1) элементы с индексами 1 и 2 удалились, остался элемент с индексом 0
Алексей1153 вне форума Ответить с цитированием
Старый 14.12.2019, 16:35   #19
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
для каких целей вообще создавать такие массивы
Без понятий, это вы про них спросили...
Используйте std::vector.
Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Разве в С++ так нельзя?
В С++ можно все. Вы спросили про массив - получили ответ про массив.
Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Понимаю
Нет, не понимаете. В С++ "тип" и "указатель на тип" это разные вещи.
waleri вне форума Ответить с цитированием
Старый 14.12.2019, 16:47   #20
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
почему?
Код:
	ar.resize(3);
        //создали массив из трёх ячеек. В каждой ячейке находятся ссылки на разные экземпляры класса.


	ar[1] = ar[2];
        //положили ссылку из ячейки 2 в ячейку 1
        //теперь в ячейках 1 и 2 находится одинаковая ссылка на экземпляр из ячейки 2
        //ссылка на экземляр, который был в ячейке 1 теперь безвозвратно утеряна


	ar[0]= ar[1];
        //положили ссылку из ячейки 1 (копия ссылки из ячейки 2) в ячейку 0 и потеряли ссылку, которая была в ячейке 0 до этого
        // теперь в ячейках 0, 1 и 2 у нас находится одинаковая ссылка на 1 и тот же экземпляр (из ячейки 2)

  
	ar.resize(1);
        //убили два последних элемента массива, в которых были одинаковые ссылки на экземпляр из ячейки 2
        //по идее, здесь уже должна возникнуть ошибка, так как нельзя дважды убить один и тот же экземпляр
        //у нас осталась одна нулевая ячейка со ссылкой на экземпляр класса из ячейки 2, который уже убит 
        //таким образом, ячейка 0 - труп

Последний раз редактировалось BLACK_RAIN; 14.12.2019 в 16:50.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив объектов класса, C++ OmegaBerkut Общие вопросы C/C++ 16 27.11.2017 15:48
Класс содержащий массив объектов другого класса Cli Вероника99 Общие вопросы C/C++ 14 28.05.2016 13:52
Шаблонный массив объектов класса - C++ Андрей Иванов Помощь студентам 2 01.10.2015 17:07
Массив объектов класса. zipwind Общие вопросы C/C++ 8 01.05.2011 20:56
динамический массив объектов класса. С++ Шиншилка Помощь студентам 8 25.04.2011 17:58