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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2017, 09:01   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию Память при вызове перегруженного конструктора

Здравствуйте всем!

Забавляюсь с ардуино. Возник услово теоретический вопрос.

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

Собственно мякотка, как я сейчас это написал:

Код:
// main.cpp

MyButton Button(123); // так я создаю свою кнопку:

Код:
// MyButton.cpp

MyButton::MyButton(int elementNumber) {
setButtonValues(elementNumber); // здесь я подставляю нужные значения в структуру "currentButtonValues" для вызова следующего конструктора
MyButton Button(currentButtonValues); // и вызываю его:
};

MyButton::MyButton(buttonValues input){
// второй конструктор
};

Вопрос вот такой - при вызове первого конструктора резервируется память под экземпляр "Button", что происходит при вызове второго конструктора с тем же именем "Button". Можно ли вообще так делать? Создается ли новый экземпляр?
Сразу напишу что в тестовом режиме все работает. Я волнуюсь за правильность кода и за память.
BoozZzilla вне форума Ответить с цитированием
Старый 24.09.2017, 09:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Написали неправильно. Вы просто создаете объект, который уничтожается при выходе из конструктора. То, что вам надо называется делегирующий конструктор.
p51x вне форума Ответить с цитированием
Старый 24.09.2017, 09:44   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А зачем именно конструктор? Что мешает сделать просто метод(ы) и вызывать из конструктора?
waleri вне форума Ответить с цитированием
Старый 24.09.2017, 10:51   #4
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Написали неправильно. Вы просто создаете объект, который уничтожается при выходе из конструктора. То, что вам надо называется делегирующий конструктор.
Я не понимаю почему объект уничтожается. Можете в двух словах объяснить? Конструктор инициализирует "Button", почему он не уничтожается в обычном случае но в этом случае после выхода уничтожится?
Я посмотрел на делегирующие конструкторы, это интересно, но я не вкурил пока как я могу это использовать. Я не понимаю как делегировать с моей последовательностью действий, она не позволяет.
Я подумаю ещё, спасибо за совет. И всё таки хотелось бы узнать почему в моем случае объект будет удалятся при выходе из конструктора.

Цитата:
Сообщение от waleri Посмотреть сообщение
А зачем именно конструктор? Что мешает сделать просто метод(ы) и вызывать из конструктора?
Вот тут я целиком за, так и сделаю.

Спасибо!

upd: Можно на ты

Последний раз редактировалось BoozZzilla; 24.09.2017 в 11:02. Причина: Я парень простой
BoozZzilla вне форума Ответить с цитированием
Старый 24.09.2017, 10:59   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что у объектов есть область видимости. В данном случае:
Код:
MyButton::MyButton(int elementNumber) {
setButtonValues(elementNumber); // здесь я подставляю нужные значения в структуру "currentButtonValues" для вызова следующего конструктора
MyButton Button(currentButtonValues); // и вызываю его:
};
вы создаете новый временный объект, вызвав его конструктор с параметром currentButtonValues. То, что вы его не назвали конкретно a, b, c или как-то еще значениея не имеет. Естественно, он уничтожится при выходе из функции (конструктора). А вот делегирующие конструкторы имеенно то, что вы хотите сделать. Можно еще через this поиграться, но не стоит так делать в новом коде.
p51x вне форума Ответить с цитированием
Старый 24.09.2017, 11:22   #6
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Я хочу уяснить для себя что понял правильно.

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

И ещё: второй экземпляр он локальный? Поэтому нет проблемы с переопределением? Вроде бы имя то же самое. Или он переопределяет первый экземпляр и на выходе вообще ничего не остается после удаления?
BoozZzilla вне форума Ответить с цитированием
Старый 24.09.2017, 18:43   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
В моем варианте экземпляр "Button" создаваемый в главном коде будет виден на протяжении всей программы, а новый экземпляр создается конструктором номер два, но виден только в области конструктора номер один(откуда был вызван второй) и уничтожается при выходе из конструктора номер один?
В общем, да, если первый баттон глобальный или создан в мейне вне блоков.

Цитата:
И ещё: второй экземпляр он локальный? Поэтому нет проблемы с переопределением? Вроде бы имя то же самое. Или он переопределяет первый экземпляр и на выходе вообще ничего не остается после удаления?
Вы даже можете написать:
Код:
int a = 1;
{
  float a = 1;
  ...
}
Конечно, вам могу дать варнинг,, но это эе не ошибка. А если переменная в другой функции...
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему при наличии конструктора в функции пишется название конструктора::и название метода класса? Мой повелитель Общие вопросы C/C++ 5 22.04.2016 00:41
вызов конструктора одного класса внутри конструктора другого tolikprankster Помощь студентам 1 04.08.2014 12:42
ошибка при вызове процедуры Emperator12 Общие вопросы Delphi 8 22.09.2012 00:52
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора jennya Visual C++ 8 03.10.2010 19:03