Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Как вызвать конструктор по указателю? - C++

02.03.2014, 11:20. Просмотров 437. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 TBase  *Buffer;
 TBase  *p;
 TBase  *End;
 size_t  NewSize;
 NewSize=Count*sizeof(TBase);
 if ((NewSize/sizeof(TBase))==Count)
 {
  if (Count>this->Count)
  {
   Buffer=(TBase*)realloc((void*)Data, NewSize);
   if (_msize(Buffer)!=NewSize)
   {
    return false;
   }
   for (p=Buffer+Count-1, End=Buffer+this->Count; p>=End; --p)
   {
    // Здесь надо вызвать конструктор для объекта *p
   }
  }
 }
 return true;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 11:20     Как вызвать конструктор по указателю?
Посмотрите здесь:

Выделить память под несколько элементов + вызвать конструктор для каждого C++
как вызвать конструктор? C++
C++ вызвать конструктор
как привильно создать и вызвать конструктор для массив обьектов C++
C++ Как вызвать конструктор для неизвестного объекта?
Как вызвать конструктор с параметрами в конструкторе без параметров? C++
C++ Как вызвать другой конструктор для уже созданного объекта конструктором по умолчанию?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
02.03.2014, 11:21     Как вызвать конструктор по указателю? #2
Конструктор нельзя вызывать. Он может вызываться только автоматически: либо при создании объекта, либо при вызове new. Т.е. в твоём случае надо воспользоваться конструкцией placement new (если я правильно понял, чего ты хочешь)
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.03.2014, 11:22  [ТС]     Как вызвать конструктор по указателю? #3
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. в твоём случае надо воспользоваться конструкцией placement new
А как?
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
02.03.2014, 11:28     Как вызвать конструктор по указателю? #4
Я на Си++ не программирую, синтаксис точно не помню, в твоей программе какой-то огрызок, а потому могу только догадаться, что ты имеешь в виду. Если я догадываюсь правильно, то

C++
1
new (p) TBase;
Добавлено через 36 секунд
Цитата Сообщение от tarasproger Посмотреть сообщение
Здесь надо вызвать конструктор для объекта *p
У тебя нету никакого объекта, т.к. ты его не создавал. У тебя есть указатель, а не объект

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

C++
1
p->~TBase();
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.03.2014, 11:29  [ТС]     Как вызвать конструктор по указателю? #5
Цитата Сообщение от Evg Посмотреть сообщение
У тебя нету никакого объекта,
Ну разумеется, раз я только собираюсь вызвать конструктор.
Цитата Сообщение от Evg Посмотреть сообщение
т.к. ты его не создавал.
А для чего по-Вашему я собираюсь вызывать конструктор?

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
, а потому могу только догадаться, что ты имеешь в виду.
Метод ReSize объекта-массива.
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
02.03.2014, 11:32     Как вызвать конструктор по указателю? #6
Цитата Сообщение от tarasproger Посмотреть сообщение
А для чего по-Вашему я собираюсь вызывать конструктор?
Для чего ты собираешься вызвать конструктор - я не знаю. Я языке Си++ конструктор занимается инициализацией полей объекта, а вовсе не созданием объекта, как тебе кажется
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.03.2014, 11:36  [ТС]     Как вызвать конструктор по указателю? #7
Ваще то конструктор инициализирует поля объекта для того, чтоб гарантировать правильное создание объекта, которое состоит из выделения памяти и инициализации полей. То, что объект безымянный, принципиального значения не имеет, важней то, что пока только выделена память, но вместо объекта в ней валяется мусор.
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
02.03.2014, 11:38     Как вызвать конструктор по указателю? #8
Цитата Сообщение от tarasproger Посмотреть сообщение
важней то, что пока только выделена память, но вместо объекта в ней валяется мусор
Важно то, что память выделена, а объекта там нет. Объект появляется только после вызова оператора new, который в процессе своей работы вызовет конструктор
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.03.2014, 11:40  [ТС]     Как вызвать конструктор по указателю? #9
А где можно прочитать точный синтаксис плейсимет нью?
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.03.2014, 12:38     Как вызвать конструктор по указателю? #10
Цитата Сообщение от tarasproger Посмотреть сообщение
А где можно прочитать точный синтаксис плейсимет нью?
http://lmgtfy.com/?q=placement+new
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 12:42     Как вызвать конструктор по указателю?
Еще ссылки по теме:

Как правильно вызвать конструктор вектора в данном случае? C++
Вызвать конструктор в поле класса C++
C++ Вызвать конструктор произвольного класса в другом классе
Не получается вызвать конструктор "деда" C++
Нюансы синтаксиса: как вызвать функцию по указателю? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.03.2014, 12:42  [ТС]     Как вызвать конструктор по указателю? #11
Ну это то я попробовал до вопроса.
Yandex
Объявления
02.03.2014, 12:42     Как вызвать конструктор по указателю?
Ответ Создать тему
Опции темы

Текущее время: 23:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru