Может ли конструктор объекта вернуть ноль?

Компилятор будет генерировать код для каждого экземпляра шаблона при использовании шаблона во время этапа компиляции. В процессе компиляции и компоновки файлы .cpp преобразуются в чистый объектный или машинный код, который в них содержит ссылки или неопределенные символы, поскольку файлы .h, которые включены в ваш main.cpp, не имеют реализации YET. Они готовы быть связаны с другим объектным файлом, который определяет реализацию для вашего шаблона, и, следовательно, у вас есть полный исполняемый файл a.out. Однако, поскольку шаблоны необходимо обрабатывать на этапе компиляции, чтобы сгенерировать код для каждого экземпляра шаблона, который вы делаете в своей основной программе, ссылка не поможет, поскольку компиляция main.cpp в main.o, а затем компиляция вашего шаблона .cpp в template.o, а затем ссылка не будет достигать цели шаблонов, потому что я связываю различные экземпляры шаблонов с одной и той же реализацией шаблона! И шаблоны должны делать обратное, т. Е. Иметь одну реализацию, но допускать много доступных экземпляров посредством использования одного класса.

Значение typename T get заменяется во время этапа компиляции, а не на этапе связывания, поэтому, если я попытаюсь для компиляции шаблона без замены T в качестве конкретного типа значения, чтобы он не работал, потому что это определение шаблонов - это процесс времени компиляции, а мета-программирование btw - все об использовании этого определения.

34
задан Thomas Bonini 3 February 2010 в 08:35
поделиться

4 ответа

По-моему, что else оператор предлагает, то, что предыдущие разработчики не знали свой C#. Конструктор всегда возвращает созданный объект или выдает исключение.

В очень прежние времена, конструкторы C++ могли возвратиться null, поэтому возможно, проблема возникает из этого. Это больше не верно в C++ также, по крайней мере, для значения по умолчанию new оператор.

37
ответ дан Gorpik 3 February 2010 в 08:35
поделиться

Редактирование: для разъяснения существует безумный пограничный случай , где можно добраться null из конструктора класса, но откровенно я не думаю, что любой реальный код должен когда-либо , ожидают иметь дело с этим уровнем сумасшедших: What' s самый странный угловой случай you' ve замечен в C# или.NET? . Ко всему нормальный намерения: этого не произойдет.

<час>

нет, Вы не можете стать пустыми от конструктор класса (Thread, класс). Единственный случай, который я знаю того, где конструктор может (кажутся) возврат null Nullable<T> - т.е.

object foo = new int?(); // this is null

Это - немного большая проблема с дженериками:

static void Oops<T>() where T : new() {
    T t = new T();
    if (t == null) throw new InvalidOperationException();
}

static void Main() {
    Oops<int?>();
}

(конечно, существуют способы проверить/обработать, что сценарий, такой как : class)

Кроме этого, конструктор будет всегда или возвращать объект (или инициализировать структуру), или выдайте исключение.

27
ответ дан Community 3 February 2010 в 08:35
поделиться
  • 1
    Шаблоны являются идиомами, зарегистрированными в определенный стиль. То, что шаблоны GoF могли бы соответствовать " ранний ограниченный императив, ориентированный на цель на languages" ни здесь, ни там. Существуют некоторые наборы функциональных шаблонов, было бы хорошо, если бы было намного больше. – stephen tetley 15 August 2011 в 22:57

НЕТ! та пустая проверка избыточна. Партия C++ devs, кто переместился в C#, имеет эту привычку к пустой проверке, и я предполагаю, что это - то же здесь.

единственная вещь - Вы, должен проверить документацию, чтобы видеть, может ли конструктор выдать какое-либо исключение. В Вашем случае относятся к http://msdn.microsoft.com/en-us/library/xx3ezzs2.aspx , и, как упомянуто конструктор будет всегда возвращать допустимый obj.

2
ответ дан Sesh 3 February 2010 в 08:35
поделиться
  • 1
    Да, they' идиомы ре, потому что there' s никакое прямое лингвистическое обеспечение и язык делает его нетривиальным, чтобы сделать те вещи хорошо. Следовательно, идиомы для того, как сделать их хорошо. – Marcin 15 August 2011 в 23:02

Можно заставить его появиться как объект ctor пустой указатель возвратов:

http://seattlesoftware.wordpress.com/2008/03/05/returning-null-from-a-class-constructor/

Поиск "Другого шаблона, который я haven’t, замеченный используемый, позволяю недопустимому объекту эмулировать нулевую ссылку" и читать оттуда.

2
ответ дан core 3 February 2010 в 08:35
поделиться
  • 1
    Или как сделать их вообще. Как монада состояния на чисто функциональных языках. – Ionuț G. Stan 15 August 2011 в 23:05
Другие вопросы по тегам:

Похожие вопросы: