Страница 1 из 9

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

Добавлено: 01 сен 2015, 10:06
Сионист
В классе два конструктора. Можно сделать так, чтоб один из них был мог быть использован только один раз, а при попытке использовать его дважды проект не компилировался?

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

Добавлено: 01 сен 2015, 11:46
Decoder
Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.

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

Добавлено: 01 сен 2015, 12:04
Romeo
Вызов конструктора - это время выполнения. А ты хочешь, чтобы компиляция упала. Такого не бывает.

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

Добавлено: 02 сен 2015, 09:19
Сионист
Decoder писал(а):Опиши суть твоей задачи. Я уверен, что найдётся более адекватное решение.
Все экземпляры кроме одного должны базироваться на существующих экземплярах своего класса, соответственно в конструктор передаётся ссылка на существующий экземпляр. Без этой ссылки они вообще теряют смысл из-за особенностей рекурсии данного типа: один экземпляр сам по себе, любой другой экземпляр определяется через отличие от существующего. Ну вроде того, как нельзя ввести две единицы длины, не определив их отношение, но одна единица длины может существовать просто в виде физического эталона. Но при создании первого экземпляра ссылку взять негде и вызывается другой конструктор, которому эта ссылка не нужна.

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

Добавлено: 02 сен 2015, 09:21
Сионист
Romeo писал(а):Вызов конструктора - это время выполнения. А ты хочешь, чтобы компиляция упала. Такого не бывает.
Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.

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

Добавлено: 02 сен 2015, 11:31
Romeo
Сионист писал(а):Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
Вот поэтому я и говорю, что нельзя.
Сионист писал(а): Все экземпляры кроме одного должны базироваться на существующих экземплярах своего класса, соответственно в конструктор передаётся ссылка на существующий экземпляр. Без этой ссылки они вообще теряют смысл из-за особенностей рекурсии данного типа: один экземпляр сам по себе, любой другой экземпляр определяется через отличие от существующего. Ну вроде того, как нельзя ввести две единицы длины, не определив их отношение, но одна единица длины может существовать просто в виде физического эталона. Но при создании первого экземпляра ссылку взять негде и вызывается другой конструктор, которому эта ссылка не нужна.
Обычно в таких случаях делают два отдельных класса. Как правило у эталона по логике бывает меньше функционала, так что такое разделение ещё и сыграет на руку принципу привилегий. Также это решит и проблему конструкторов, так как у каждого класса конструктор будет свой: один будет конструироваться сам по себе, а второй, получая ссылку на первый. Если же при этом в двух классах всё-таки возникает дублирование, то общие данные и/или код, можно выделить в базовый класс.

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

Добавлено: 02 сен 2015, 11:33
Оксалайя
Сионист писал(а):Можно уронить компиляцию, закрыв конструктор, проблема в том, что один раз этот конструктор должен быть всё таки использован.
Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.

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

Добавлено: 02 сен 2015, 11:42
Romeo
Оксалайя писал(а):Ну так первый раз вызовите этот конструктор как открытый, а второй раз - как закрытый. Это называется конструктор Шредингера, поищите у Шилдта.
Браво! Порой я думаю, что с господином Сионистом только такими методами и можно бороться :)

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

Добавлено: 02 сен 2015, 11:55
Сионист
Romeo писал(а):Обычно в таких случаях делают два отдельных класса. Как правило у эталона по логике бывает меньше функционала, так что такое разделение ещё и сыграет на руку принципу привилегий.
Его не может быть меньше.

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

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