| 1 2 3 |
| Как запретить создание объектов в памяти стека. | |
| От: | Аноним 9 | ||
| Дата: | 18.03.10 11:50 |
| Есть полиморфная иерархия классов. Необходимо запретить создание объектов классов этой иерархии в памяти стека(например: Type ob; // должно приводить к ошибке компиляции), а разрешить только в динамической(с помощью new)? При этом производные классы изменять недопустимо, можно только базовый. |
| Re: Как запретить создание объектов в памяти стека. | |
| От: | placement_new | ||
| Дата: | 18.03.10 12:05 | ||
| Оценка: | +1 -1 ![]() | ||
| Здравствуйте, Аноним, Вы писали: А>Есть полиморфная иерархия классов. Необходимо запретить создание объектов классов этой иерархии в памяти стека(например: Type ob; // должно приводить к ошибке компиляции), а разрешить только в динамической(с помощью new)? При этом производные классы изменять недопустимо, можно только базовый. Перенести деструктор в защищенную секцию |
| Re[2]: Как запретить создание объектов в памяти стека. | |
| От: | Кодт модератор | ||
| Дата: | 18.03.10 12:56 | ||
| Оценка: | +1 ![]() | ||
| Здравствуйте, placement_new, Вы писали: _>Перенести деструктор в защищенную секцию Твой никнейм как бы намекает... Перекуём баги на фичи! |
| Re[2]: Как запретить создание объектов в памяти стека. | |
| От: | K13 | ||
| Дата: | 18.03.10 13:17 |
| _>Перенести деструктор в защищенную секцию Унаследоваться от такого класса — и вперед. |
| Re[3]: Как запретить создание объектов в памяти стека. | |
| От: | uzhas | ||
| Дата: | 18.03.10 13:27 |
| Здравствуйте, K13, Вы писали: _>>Перенести деструктор в защищенную секцию K13>Унаследоваться от такого класса — и вперед. Поясните, что вы имеете в виду Вот как я понял вашу рекомендацию:
но этот код у меня компилируется =\ как сделать. чтобы не компилировалось? |
| Re[2]: Как запретить создание объектов в памяти стека. | |
| От: | niralex | ||
| Дата: | 18.03.10 13:29 |
| Здравствуйте, placement_new, Вы писали: _>Здравствуйте, Аноним, Вы писали: А>>Есть полиморфная иерархия классов. Необходимо запретить создание объектов классов этой иерархии в памяти стека(например: Type ob; // должно приводить к ошибке компиляции), а разрешить только в динамической(с помощью new)? При этом производные классы изменять недопустимо, можно только базовый. _>Перенести деструктор в защищенную секцию в protected? Тогда в производных классах также нужно сделать деструктор protected, но согласно начальному условию, изменять производные классы нельзя. А если в потомках оставить деструктор public, то объекты можно создавать в стековой памяти. |
| Re[2]: Как запретить создание объектов в памяти стека. | |
| От: | dabeat_bf | ||
| Дата: | 18.03.10 13:47 |
| Здравствуйте, placement_new, Вы писали: _>Перенести деструктор в защищенную секцию лучше в private
|
| Re[3]: Как запретить создание объектов в памяти стека. | |
| От: | niralex | ||
| Дата: | 18.03.10 13:50 |
| Здравствуйте, dabeat_bf, Вы писали: _>Здравствуйте, placement_new, Вы писали: _>>Перенести деструктор в защищенную секцию _>лучше в private _>
тогда нельзя создать объект производного от А класса никаким спосом |
| Re: Как запретить создание объектов в памяти стека. | |
| От: | uzhas | ||
| Дата: | 18.03.10 13:58 | ||
| Оценка: | +1 | ||
| Здравствуйте, Аноним, Вы писали: А>При этом производные классы изменять недопустимо, можно только базовый. Спрячь наследников и предоставь фабрики, которые будут возвращать std::auto_ptr<Base>. Тогда все клиенты отвалятся и будут вынуждены использовать фабрики =) |
| Re[4]: Как запретить создание объектов в памяти стека. | |
| От: | dabeat_bf | ||
| Дата: | 18.03.10 14:23 | ||
| Оценка: | -1 | ||
| Здравствуйте, niralex, Вы писали: N>тогда нельзя создать объект производного от А класса никаким спосом можно так:
|
| Re[5]: Как запретить создание объектов в памяти стека. | |
| От: | Мишень-сан | ||
| Дата: | 18.03.10 14:31 |
| Здравствуйте, dabeat_bf, Вы писали: _>можно так: _>
|
| Re[6]: Как запретить создание объектов в памяти стека. | |
| От: | dabeat_bf | ||
| Дата: | 18.03.10 14:39 | ||
| Оценка: | ![]() | ||
| _>>можно так: _>> // а здесь имеем утечку — конструктор копии отработает, _>> // но вот его аргумент, живущий в куче, потеряется. _>> B() : A(*A::Create()) _>> { _>> }; _>>}; _>>[/ccode] это все зависит от того, как конструктор копирования будет выглядеть на самом деле задача не тривиальная, как следствие решение (если таковое есть) будет тоже извращенным |
| Re[7]: Как запретить создание объектов в памяти стека. | |
| От: | Мишень-сан | ||
| Дата: | 18.03.10 14:52 |
| Здравствуйте, dabeat_bf, Вы писали: _>это все зависит от того, как конструктор копирования будет выглядеть _>на самом деле задача не тривиальная, как следствие решение (если таковое есть) будет тоже извращенным Насколько я знаю, нормального решения именно для иерархии при такой постановке нет. Пока единственное хоть сколько-нибудь рабочее — заныкать иерархию и отдавать через фабрики. Тоже метод в общем-то. А по поводу конструктора копии —
Это имеете ввиду? Думаю, не нужно говорить, что случится, если кто-то, создавая иерархию, передаст туда временный объект... |
| Re[8]: Как запретить создание объектов в памяти стека. | |
| От: | dabeat_bf | ||
| Дата: | 18.03.10 15:00 |
| Здравствуйте, Мишень-сан, Вы писали: МС>А по поводу конструктора копии — МС>
МС>Это имеете ввиду? МС>Думаю, не нужно говорить, что случится, если кто-то, создавая иерархию, передаст туда временный объект... я не говрил о конкретной реализации, но придумать что-то можно, например в вашем случае если передавать в конструктор копирования не константную ссылку, то временный объект туда никто не передаст, но опять таки нужно думать чтоб придумать что-то стоящее я просто предложил направление для размышления |
| Re[8]: Как запретить создание объектов в памяти стека. | |
| От: | dabeat_bf | ||
| Дата: | 18.03.10 15:15 |
| Здравствуйте, Мишень-сан, Вы писали: например так можно так попробовать:
|
| Re: А зачем всё это надо? | |
| От: | Erop | ||
| Дата: | 18.03.10 15:28 |
| Здравствуйте, Аноним, Вы писали: А>Есть полиморфная иерархия классов. Необходимо запретить создание объектов классов этой иерархии в памяти стека(например: Type ob; // должно приводить к ошибке компиляции), а разрешить только в динамической(с помощью new)? При этом производные классы изменять недопустимо, можно только базовый. А зачем всё это надо? Можно, например, завести какой-нибудь объект, к которому у наследников нет доступа, и чисто-виртуальный метод, в реализации которого нужен доступ к этому объекту, ну и вперёд. Создавать объекты производных классов сможет только твоя фабрика
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском |
| Re[2]: Так, кстати, логичнее, но непонятнее... ;) | |
| От: | Erop | ||
| Дата: | 18.03.10 15:31 | ||
| Оценка: | 6 (2) | ||
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском |
| Re[2]: А зачем всё это надо? | |
| От: | Feonyf | ||
| Дата: | 18.03.10 15:33 | ||
| Оценка: | 3 (1) +1 ![]() | ||
| Здравствуйте, Erop, Вы писали: E>А зачем всё это надо? Наверно у них какой-то объект стек портит и они защищаются таким образом от порчи стека. Моя строка построения буста: .\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64 |
| Re[3]: O!!! Ну тогда надо ЖЕЧЬ!!!! ;) | |
| От: | Erop | ||
| Дата: | 18.03.10 15:49 | ||
| Оценка: | ![]() | ||
| Здравствуйте, Feonyf, Вы писали: F>Наверно у них какой-то объект стек портит и они защищаются таким образом от порчи стека. О! Тогда можно подзажечь по-взрослому:
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском |
| Re[3]: Так, кстати, логичнее, но непонятнее... ;) | |
| От: | niralex | ||
| Дата: | 18.03.10 17:52 |
| Здравствуйте, Erop, Вы писали: E>
Красиво... Это то, что надо. |
| 1 2 3 |