Как запретить повторное использование конструктора?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
В классе два конструктора. Можно сделать так, чтоб один из них был мог быть использован только один раз, а при попытке использовать его дважды проект не компилировался?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.
Поумнеть несложно, куда труднее от дури избавиться.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Вызов конструктора - это время выполнения. А ты хочешь, чтобы компиляция упала. Такого не бывает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Все экземпляры кроме одного должны базироваться на существующих экземплярах своего класса, соответственно в конструктор передаётся ссылка на существующий экземпляр. Без этой ссылки они вообще теряют смысл из-за особенностей рекурсии данного типа: один экземпляр сам по себе, любой другой экземпляр определяется через отличие от существующего. Ну вроде того, как нельзя ввести две единицы длины, не определив их отношение, но одна единица длины может существовать просто в виде физического эталона. Но при создании первого экземпляра ссылку взять негде и вызывается другой конструктор, которому эта ссылка не нужна.Decoder писал(а):Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.Romeo писал(а):Вызов конструктора - это время выполнения. А ты хочешь, чтобы компиляция упала. Такого не бывает.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Вот поэтому я и говорю, что нельзя.Сионист писал(а):Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
Обычно в таких случаях делают два отдельных класса. Как правило у эталона по логике бывает меньше функционала, так что такое разделение ещё и сыграет на руку принципу привилегий. Также это решит и проблему конструкторов, так как у каждого класса конструктор будет свой: один будет конструироваться сам по себе, а второй, получая ссылку на первый. Если же при этом в двух классах всё-таки возникает дублирование, то общие данные и/или код, можно выделить в базовый класс.Сионист писал(а): Все экземпляры кроме одного должны базироваться на существующих экземплярах своего класса, соответственно в конструктор передаётся ссылка на существующий экземпляр. Без этой ссылки они вообще теряют смысл из-за особенностей рекурсии данного типа: один экземпляр сам по себе, любой другой экземпляр определяется через отличие от существующего. Ну вроде того, как нельзя ввести две единицы длины, не определив их отношение, но одна единица длины может существовать просто в виде физического эталона. Но при создании первого экземпляра ссылку взять негде и вызывается другой конструктор, которому эта ссылка не нужна.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.Сионист писал(а):Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Браво! Порой я думаю, что с господином Сионистом только такими методами и можно боротьсяОксалайя писал(а):Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Его не может быть меньше.Romeo писал(а):Обычно в таких случаях делают два отдельных класса. Как правило у эталона по логике бывает меньше функционала, так что такое разделение ещё и сыграет на руку принципу привилегий.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
И что же останется в производном? Ничего. Вывод: его не может быть. Метр как то отличается от километра? Нет, ничем, кроме количественной разницы и того, что он выбран основной единицей. А можно было бы метр определить через километр. Также, как килограмм выбран основной единицей, а грамм определён через него как тысячная доля. Нельзя ввести сразу и грамм, и килограмм, не вводя их отношения, нельзя ввести сразу и метр, и километр, не вводя их отношения, но можно ввести метр и килограмм, не вводя их отношения, так как это единицы разных величин.Romeo писал(а):Если же при этом в двух классах всё-таки возникает дублирование, то общие данные и/или код, можно выделить в базовый класс.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.