![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
akahan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 11.2.2007 Репутация: нет Всего: нет |
Привет, хакеры!
Мне нужно при создании экземпляра класса запретить его создание! Т.Е., допустим:
Правильный ли это код??? Если нет, то как мне сделать, что-бы при не прохождениии условия экземпляр класса не создавался, а возвращался допустим NULL. Это сообщение отредактировал(а) akahan - 1.3.2007, 16:10 |
|||
|
||||
Fazil6 |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
тут нужно бросать исключение по проверке условия а лучше вот так
Это сообщение отредактировал(а) Fazil6 - 1.3.2007, 16:26 |
||||||
|
|||||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
вариант попроще(как это реализовано в паттерне "Одиночка"): делаешь конструктор private, а вместо new foo используешь вызов некой функции getInstance. правда, я не знаю, можно ли объявить статический метод, тип результата которого - сам класс... или, может, потом(при создании) приведение типов делать надо будет... Не в курсе
![]() |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
Чем же он проще? Я именно это и написал. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
akahan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 11.2.2007 Репутация: нет Всего: нет |
Допустим, последний вариант хороший, но как быть если foo наследуется от bar?
Что должна создавать Create класс foo или bar? По идее расшаренная функция Create должна быть в классе bar. Можно ли будет переопределять эту функцию в наследуемых классах? Или что делать в таком случае? Можно, конечно и непереопределять, но тогда придется делать каждый раз dynamic_cast? |
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
тут лучше фабрику юзать.
Это сообщение отредактировал(а) Fazil6 - 2.3.2007, 01:59 |
||||
|
|||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
Ммм... а может стоит поместить чистую виртуальную функцию в класс, чтобы сделать его абстрактным?
|
|||
|
||||
Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
||||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
console, тогда тому, кто будет читать твой код, будет непонятно, чего хочешь сделать
|
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
||||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
console, ну я буду думать, что твой не только нельзя создать, но он еще и наследуется где-то, хотя это на самом деле не так
![]() |
|||
|
||||
threef |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
и обьект не динамический , и не создастся - в общем, я согласен с Fazil6 |
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
threef, неправильный код.
как создать второй объект? третий?
это конечно не ошибка, но это ведь плохо... Это исключение ради исключения. Выбор варианта обработки исключения должен производится на основании типа объекта исключения, а не его значения. Пока мы не проверим что в строке, мы не знаем что за ошибка. Я не придираюсь - просто глаз всегда цепляется за такие ляпы. |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Немного в тему: чтобы экземпляров класса точно не создали, лучше всего не писать сам класс. Другой вариант - в документации жирно и крупно написать - не создавай экземпляров этого класса. |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
||||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
сделать конструктор protected? -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Fazil6, запрет создания объекта при возможности создать наследников, imho. То есть в явном виде сам объект базового не будет существовать. Этj размышления, не проверял.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Проверил.
Таким образом мы разрешаем наследование, но запрещаем создание объекта базового класса. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Ну по-моему и так понятно - private, если класс не наследуется, protectd, если наследуется. Явно указывать защищенность конструктора и деструктора надо, как завещал Саттер
![]() |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Саттер еще живой. Если он и указывал закрывать конструкторы, то явно не в том контексте в каком ты понял. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Rockie, я не говорю "закрывать", я говорю "указывать спецификатор доступа" (public,protected,private) - обязаловка
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
2 Пользователей читают эту тему (2 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |