Как запретить повторное использование конструктора?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Закрыто
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В классе два конструктора. Можно сделать так, чтоб один из них был мог быть использован только один раз, а при попытке использовать его дважды проект не компилировался?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Decoder писал(а):Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.
Все экземпляры кроме одного должны базироваться на существующих экземплярах своего класса, соответственно в конструктор передаётся ссылка на существующий экземпляр. Без этой ссылки они вообще теряют смысл из-за особенностей рекурсии данного типа: один экземпляр сам по себе, любой другой экземпляр определяется через отличие от существующего. Ну вроде того, как нельзя ввести две единицы длины, не определив их отношение, но одна единица длины может существовать просто в виде физического эталона. Но при создании первого экземпляра ссылку взять негде и вызывается другой конструктор, которому эта ссылка не нужна.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Вызов конструктора - это время выполнения. А ты хочешь, чтобы компиляция упала. Такого не бывает.
Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Сионист писал(а):Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Оксалайя писал(а):Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.
Браво! Порой я думаю, что с господином Сионистом только такими методами и можно бороться :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Обычно в таких случаях делают два отдельных класса. Как правило у эталона по логике бывает меньше функционала, так что такое разделение ещё и сыграет на руку принципу привилегий.
Его не может быть меньше.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Если же при этом в двух классах всё-таки возникает дублирование, то общие данные и/или код, можно выделить в базовый класс.
И что же останется в производном? Ничего. Вывод: его не может быть. Метр как то отличается от километра? Нет, ничем, кроме количественной разницы и того, что он выбран основной единицей. А можно было бы метр определить через километр. Также, как килограмм выбран основной единицей, а грамм определён через него как тысячная доля. Нельзя ввести сразу и грамм, и килограмм, не вводя их отношения, нельзя ввести сразу и метр, и километр, не вводя их отношения, но можно ввести метр и килограмм, не вводя их отношения, так как это единицы разных величин.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Закрыто