Re[3]: Explicit initialization
От: Were  
Дата: 24.06.08 10:55
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Может, всё-таки ты объяснишь, какая задача перед тобой стоит?


Можно назвать это рефакторингом. Класс уже юзается и неявно инициализируется временным объектом (через равно). И это вполне допустимо, и не хочется терять такое поведение. Но я осознал опасность неявного создание класса, из-за его специфики, при инициализации аргументов функции. Теперь хочу запретить такое неявное поведение во избежании дальнейших ошибок.
Re[3]: Explicit initialization
От: Were  
Дата: 24.06.08 11:02
Оценка:
Здравствуйте, Bell, Вы писали:

B>Компиляторы VC (с уверенностью могу сказать про VC6, VC7.1), однако, игнорируют это требование.

B>Например, если в примере выше объявить конструктор копирования test::test(const test&) закрытым, то VC все равно скомпилирует пример, котя по стандарту не должен.

Я так понимаю, неявное создание компилятором объекта приватного класса тоже подпадает под эту особенность?
Re[4]: Explicit initialization
От: Bell Россия  
Дата: 24.06.08 11:04
Оценка:
Здравствуйте, Were, Вы писали:

W>Здравствуйте, Bell, Вы писали:


B>>Компиляторы VC (с уверенностью могу сказать про VC6, VC7.1), однако, игнорируют это требование.

B>>Например, если в примере выше объявить конструктор копирования test::test(const test&) закрытым, то VC все равно скомпилирует пример, котя по стандарту не должен.

W>Я так понимаю, неявное создание компилятором объекта приватного класса тоже подпадает под эту особенность?

Конечно.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Explicit initialization
От: Кодт Россия  
Дата: 24.06.08 11:19
Оценка:
Здравствуйте, Were, Вы писали:

W>Можно назвать это рефакторингом. Класс уже юзается и неявно инициализируется временным объектом (через равно). И это вполне допустимо, и не хочется терять такое поведение. Но я осознал опасность неявного создание класса, из-за его специфики, при инициализации аргументов функции. Теперь хочу запретить такое неявное поведение во избежании дальнейших ошибок.


Ну, если невозможно навязать пользователям стиль
void function( CRef<YourClass> );

то остаётся путь кровавого рефакторинга: вносишь изменение, гарантированно ломающее компиляцию, и несложным способом подчищаешь все места ошибок.

Два варианта:
1) Объявить конструктор явным, а для удобства — см. фокус с approved.
2) Определить пару классов, один с неявным конструктором — для уже имеющегося кода, а второй с явным — для грядущего. Естественно, с общей реализацией (например, унаследовать один от другого). Заменить все вхождения исходного класса на класс с неявным конструктором. На публику же отдать класс с явным конструктором.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.