Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Как запретить создание экземпляра класса? |
Автор: akahan 1.3.2007, 16:09 | ||
Привет, хакеры! Мне нужно при создании экземпляра класса запретить его создание! Т.Е., допустим:
Правильный ли это код??? Если нет, то как мне сделать, что-бы при не прохождениии условия экземпляр класса не создавался, а возвращался допустим NULL. |
Автор: Fazil6 1.3.2007, 16:18 | ||||||
тут нужно бросать исключение по проверке условия а лучше вот так
|
Автор: skyboy 1.3.2007, 16:31 |
вариант попроще(как это реализовано в паттерне "Одиночка"): делаешь конструктор private, а вместо new foo используешь вызов некой функции getInstance. правда, я не знаю, можно ли объявить статический метод, тип результата которого - сам класс... или, может, потом(при создании) приведение типов делать надо будет... Не в курсе ![]() |
Автор: Fazil6 1.3.2007, 16:36 | ||
Чем же он проще? Я именно это и написал. |
Автор: skyboy 1.3.2007, 16:36 |
опоздал ![]() Добавлено @ 16:37 когда я писал свой пост, ты ешё его не редактировал. неужто сложно догадаться, что пять минут - совсем небольшой срок? ![]() |
Автор: akahan 2.3.2007, 01:29 |
Допустим, последний вариант хороший, но как быть если foo наследуется от bar? Что должна создавать Create класс foo или bar? По идее расшаренная функция Create должна быть в классе bar. Можно ли будет переопределять эту функцию в наследуемых классах? Или что делать в таком случае? Можно, конечно и непереопределять, но тогда придется делать каждый раз dynamic_cast? |
Автор: Fazil6 2.3.2007, 01:57 | ||||
тут лучше фабрику юзать.
|
Автор: console 2.3.2007, 23:12 |
Ммм... а может стоит поместить чистую виртуальную функцию в класс, чтобы сделать его абстрактным? |
Автор: Athlon 2.3.2007, 23:29 |
+1, тогда уж точно создать экземпляр класса не удастся ![]() |
Автор: Fazil6 2.3.2007, 23:53 | ||
интересная мысль... А может не надо? |
Автор: Xenon 3.3.2007, 00:02 |
console, тогда тому, кто будет читать твой код, будет непонятно, чего хочешь сделать |
Автор: Daevaorn 3.3.2007, 00:35 | ||
судя по вопросу автора данной темы, вариант с фабрикой его устроит. А абстрактный класс это уже другая песьня. |
Автор: Xenon 3.3.2007, 02:14 |
console, ну я буду думать, что твой не только нельзя создать, но он еще и наследуется где-то, хотя это на самом деле не так ![]() |
Автор: threef 3.3.2007, 11:15 | ||
и обьект не динамический , и не создастся - в общем, я согласен с Fazil6 |
Автор: Fazil6 3.3.2007, 16:36 | ||||
threef, неправильный код.
как создать второй объект? третий?
это конечно не ошибка, но это ведь плохо... Это исключение ради исключения. Выбор варианта обработки исключения должен производится на основании типа объекта исключения, а не его значения. Пока мы не проверим что в строке, мы не знаем что за ошибка. Я не придираюсь - просто глаз всегда цепляется за такие ляпы. |
Автор: Любитель 4.3.2007, 00:52 | ||
Немного в тему: чтобы экземпляров класса точно не создали, лучше всего не писать сам класс. Другой вариант - в документации жирно и крупно написать - не создавай экземпляров этого класса. |
Автор: console 4.3.2007, 01:00 | ||
Любитель,
Не лучше... он может служить в качестве базового класса, с определенным набором методов и данных для наследников... 2й вариант более приемлим ИМХО |
Автор: Rockie 4.3.2007, 02:05 |
сделать конструктор protected? |
Автор: Fazil6 4.3.2007, 02:07 |
и что по твоему это даст? |
Автор: Rockie 4.3.2007, 02:15 |
Fazil6, запрет создания объекта при возможности создать наследников, imho. То есть в явном виде сам объект базового не будет существовать. Этj размышления, не проверял. |
Автор: Rockie 4.3.2007, 02:34 | ||
Проверил.
Таким образом мы разрешаем наследование, но запрещаем создание объекта базового класса. |
Автор: Xenon 4.3.2007, 03:07 |
Ну по-моему и так понятно - private, если класс не наследуется, protectd, если наследуется. Явно указывать защищенность конструктора и деструктора надо, как завещал Саттер ![]() |
Автор: Rockie 4.3.2007, 14:15 | ||
Саттер еще живой. Если он и указывал закрывать конструкторы, то явно не в том контексте в каком ты понял. |
Автор: Xenon 4.3.2007, 15:58 |
Rockie, я не говорю "закрывать", я говорю "указывать спецификатор доступа" (public,protected,private) - обязаловка |