Новое размещение C++ для локальных объектов


Можно ли использовать placement new для автоматических объектов? Рассмотрим следующий пример:

class Button
{
public:
    Button() {  }
    virtual ~Button() {  }

    // and a lot of members
};

class Screen
{
public:
    Screen() {  }
    virtual ~Screen() {  }

    Button submit_btt;

    void doStuff()
    {
        // ...
        submit_btt.~Button();
        new(&submit_btt) Button();
        //...
    }

    // and a lot of members
};

void process(void)
{
    Screen myObj;

    //...
    myObj.doStuff();
    //...
}

Этот псевдокод представляет собой ситуацию, с которой столкнулись при работе с графическим интерфейсом.
Что вы думаете об этом коде? Есть ли неуверенность? Что может пойти не так? Будут ли myObj и его члены должным образом уничтожены (вызваны все деструкторы членов и все другие операции) после функции process()?


person Karolis Milieška    schedule 30.03.2017    source источник
comment
Зачем тебе это? Если вы правильно перегружаете операторы, то submit_btt = Button() корректно вызывает деструктор старой кнопки и конструктор новой. На самом деле это должно происходить даже без перегрузки operator=.   -  person Matthias247    schedule 30.03.2017
comment
@Karolis: Какая польза от кнопки new(&submit_btt)();, вы ничего не сможете с ней сделать.   -  person Sumeet    schedule 30.03.2017
comment
вам просто нужен оператор присваивания. Или лучшую структуру графического интерфейса, которая поддерживает изменение свойства кнопки.   -  person apple apple    schedule 30.03.2017
comment
Целью этого будет полный сброс объекта. Конечно, есть и другие способы.   -  person Karolis Milieška    schedule 30.03.2017
comment
Это выглядит как злобный взлом и ужасная практика кодирования, и из-за этого вы должны быть вынуждены провести неделю в службе поддержки клиентов, но, насколько я понимаю, это не запрещено стандартом C++.   -  person nwp    schedule 30.03.2017
comment
ваша Button submit_btt; больше не полиморфная кнопка.   -  person apple apple    schedule 30.03.2017
comment
@appleapple, почему?   -  person Karolis Milieška    schedule 30.03.2017
comment
@KarolisMilieška Потому что объекты-значения в C++ никогда не бывают полиморфными.   -  person Konrad Rudolph    schedule 30.03.2017
comment
@appleapple, это похоже на другую тему, но не согласен. Не могли бы вы предоставить больше информации о том, что вы говорите? Почему он не может быть полиморфным, будучи локальным (значением)?   -  person Karolis Milieška    schedule 30.03.2017
comment
Это нарезка объектов.   -  person apple apple    schedule 30.03.2017
comment
@KarolisMilieška Смотрите мой комментарий. Это не имеет никакого отношения к тому, чтобы быть местным. Но объекты-значения (не указатели, не ссылки) не могут быть полиморфными, точка. Рассмотрим эту простую проблему: полиморфные объекты могут быть разного размера (подклассы могут добавлять переменные-члены), но место, выделенное для значения, фиксировано.   -  person Konrad Rudolph    schedule 30.03.2017
comment
@KonradRudolph, конечно, но при полиморфизме мы всегда назначаем и делимся указателями и ссылками, никогда не назначая по значению. Выделенное пространство всегда будет sizeof этого класса. Вы никогда не добавляете больше памяти или не расширяете объект, а создаете новый экземпляр соответствующего класса. Я ошибся?   -  person Karolis Milieška    schedule 30.03.2017
comment
@KarolisMilieška Вы правы, но именно поэтому полиморфизм не работает с переменными, относящимися к значениям: нет места для создания нового экземпляра класса другого размера в &submit_btt. Это относится к ячейке памяти с фиксированным размером выделения sizeof(Button).   -  person Konrad Rudolph    schedule 30.03.2017
comment
@KonradRudolph, пожалуйста, приведите пример этого для НЕ значений переменных. Кроме того, я не упомянул, что пытаюсь создать объект большего размера в фиксированном меньшем месте. И еще: действительно, можно было бы создать новый экземпляр производной button и поместить ее базу в &submit_btt. Но все же, ничего похожего на присвоение полиморфных объектов по значению я не встречал даже при работе с динамической памятью. Пожалуйста, покажите мне. :)   -  person Karolis Milieška    schedule 30.03.2017
comment
@КаролисМилиешка Button*. std::unique_ptr<Button*>. Button&. и Т. Д.   -  person Konrad Rudolph    schedule 30.03.2017
comment
@KonradRudolph Это не по значению.   -  person Karolis Milieška    schedule 30.03.2017
comment
@KarolisMilieška В этом вся моя точка зрения. Вы не можете использовать полиморфизм по значению.   -  person Konrad Rudolph    schedule 30.03.2017
comment
В этом случае вы только передаете ссылки. Вы никогда не делаете значение = значение. Кроме конструкторов копирования или присваивания.   -  person Karolis Milieška    schedule 30.03.2017