Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > шаблонный operator= |
Автор: MAKCim 9.2.2006, 19:16 | ||
Есть один вопрос, допустим есть какой-нибудь контейнер, пусть даже smart pointer
вопрос в том, как можно реализовать operator=, чтобы можно было присваивать объекту класса container<T> объект класса container<C> в случае если класс C - реализация интерфейса T или просто T - открытый базовый класс для C. Вообщем надо каким-то образом получить pointer типа C* из object в примере выше. Сложность в том, что нельзя пользоваться оператором преобразования template<class P> operator container<P>() {...}, ввиду его неявного применения там, где это не нужно |
Автор: Daevaorn 9.2.2006, 19:23 | ||
MAKCim а чем не устраивает?
|
Автор: Hroft 9.2.2006, 19:27 |
Ты собираешься нарушить семантику присваивания, на мой взгляд. Где ты видел, чтобы типы аргументов оператора присваивания различались? |
Автор: Hroft 9.2.2006, 19:38 |
Ну ладно. Тогда к твоему p = pointer.p надо добавить еще освобождение правого аргумента, в смысле ему какой-нибудь null присвоить. |
Автор: Lotrex 9.2.2006, 19:47 | ||||||
По-моему, лучше сделать так:
Я умышленно в списке пр-ров написал container<T> а не container<С> Если преобразование типов будет допустимо, то тип параметра object или при вызове преобразуется автоматически, или преобразование можно явно при вызове указать... |
Автор: Daevaorn 9.2.2006, 19:53 |
Lotrex Это: p = new T накладывает ограничение на класс T, т.е. наличие открытого конструктора по умолчанию, что может быть не очень удобно если его нет, тогда использовать этот контейнер с таким классом нельзя. Ещё то, что это лишние операции, которые в принципе могут быть не нужны и могут повлеч за собой падение производительности. Хотя, конечно, всё зависит от реализации контейнера и клиентских классов... |
Автор: Lotrex 9.2.2006, 20:07 | ||
Может, тогда вот так:
Вообще-то, если p - указатель, и мы не хотим поиметь проблем, то без new тут никак не обойтись. |
Автор: Hroft 9.2.2006, 20:11 |
А что ты изменил? Предполагается все равно наличие public конструктора без параметров. И почему проблемы? Наша цель - уничтожить объект только когда он не нужен, и не раньше. |
Автор: Lotrex 9.2.2006, 20:16 | ||
Даже нет, без typeid:
|
Автор: Daevaorn 9.2.2006, 20:21 |
Lotrex![]() ![]() ![]() Это всё не имеет смысла, поскольку мы не знаем поведение класса container и деталей его реализации. |
Автор: Mayk 9.2.2006, 20:27 | ||||
Силу метапрограммирования использовать можно.
А вспомогательеые классы это что-то типа этого:
зы. проверено гнус4 и комом |
Автор: MAKCim 9.2.2006, 20:39 | ||||||||||
дело в том, что
не скомпилируется по понятным причинам (shadows template parm 'class T') (gcc 4.0) Daevaorn
написать object.p нельзя т.к container<C> и container<T> разные типы, причем p находится в private секции, т е из container<T> нет доступа к container<C>: ![]() Добавлено @ 20:41 Mayk а если у нас нет
|
Автор: Lotrex 9.2.2006, 20:42 | ||||||
Если сделать так:
и p - это указатель, мы скопируем тока значение указателя, а не данные, на которые он указывает(а надо бы совсем наоборот - данные скопировать в другую область памяти). Вот простенький примерчик(ничего, если там нужны конструкторы по умолчанию? ![]()
|
Автор: MAKCim 9.2.2006, 20:47 | ||||||
Mayk
думаю тут можно и не использовать проверку на конвертируемость, т. к
компилятор выдаст ошибку на этапе компиляции если C* не преобразуется в T* |
Автор: Daevaorn 9.2.2006, 21:05 | ||
MAKCim
Мдя, лажанулся. Тогда действительно как предложил Mayk - метод get() и static_cast |
Автор: Lotrex 9.2.2006, 21:07 | ||||
Ладно, вот мой smartpointer (пользуюсь им уже без малого 3 года, ни разу не подводил):
А вот реализация оператора присваивания:
Все фурыкает, и без глюков. Функция setlength выделяет память для указателя ptr (писать не буду, но там тоже нужен конструктор по умолчанию). Ежели сюда впихнуть класс, производный от Type - думаю, должно работать, единственное условие - у этих классов д.б. конструторы по умолчанию. Черт, извиняюсь, это т.н. "безопасный массив", safe array, который я содрал из книжки "Структуры данных в C++"... (а не smart pointer, про который я вообще нифига не знаю). |
Автор: Mayk 9.2.2006, 21:10 | ||
О! Нашёл. Тут дружбу использовать следует
|
Автор: MAKCim 9.2.2006, 22:05 | ||||||
где такое компилируется? у меня (gcc) выдает
|
Автор: MAKCim 9.2.2006, 22:22 |
Mayk, извини, все работает! я и сам уже нашел решение но намного длиннее чем это ![]() |
Автор: zabivator 14.9.2006, 13:27 |
Берем смарт-поинтер Александреску и не паримся. Там же оператор присвения курим |