2010-04-27 1 views
1

Есть ли способ заставить компилятор создать конструкторы по умолчанию, даже если я предоставляю явный конструктор?Как я могу заставить компилятор создать конструкторы по умолчанию в C++?

Иногда я нахожу их очень полезными и нахожу, что это пустая трата времени для написания, например. конструктор копирования, особенно для больших классов.

+0

Непонятный вопрос. этот тривиальный класс 'class MyClass {public: int i;};' имеет значение по умолчанию ctor, copy ctor и dtor. –

+2

@Binary Worrier: «даже если я предоставляю явный конструктор». Если вы предоставили 'MyClass' конструктор' int', тогда у него больше не будет конструктора no-arg по умолчанию. –

+0

Это правда, я был далеко от C++ для * far * слишком долго. Извиняюсь. –

ответ

2

Конструктор копирования предусмотрен ли вы определить какие-либо другие конструкторы или нет. Пока вы не объявляете конструктор копии, вы получаете его.

Конструктор no-arg предоставляется только в том случае, если вы не объявляете никаких конструкторов. Таким образом, у вас нет проблемы, если вы не хотите конструктора no-arg, но считаете это пустой тратой времени на запись.

IIRC, C++ 0x имеет способ делегирования конструкции другому конструктору. Я не могу вспомнить детали, но это позволит вам определить конструктор no-arg, указав другой конструктор, плюс аргумент (ы), чтобы перейти к нему. В некоторых случаях можно сохранить ввод некоторых инициализаторов элементов данных. Но конструктор no-arg по умолчанию также не предоставил бы эти инициализаторы.

3

Вы не можете - компилятор отключает часть своего автоматически созданного конструктора по умолчанию, когда вы предоставляете свои собственные, поэтому вы можете препятствовать построению по умолчанию определенных классов таким образом. Тем не менее, я думаю, что C++ 0x позволит явно указать реализацию по умолчанию компилятор, например:

MyClass() = default; // 'delete' also allowed by upcoming standard to disable 

Я не думаю, что компиляторы поддерживают это еще - C++ 0x (как следующий стандарт был известный) еще не окончательный, так что вам просто нужно сделать типизацию конструкторов по умолчанию. Это не много кода! MyClass() {} будет делать то же самое, что и все члены по умолчанию конструктивны.

+0

Не могли бы вы добавить ссылки? – qdii

1

Компилятор всегда будет создавать конструктор копии по умолчанию, если вы не предоставите собственное определение конструктора копирования. Ваша проблема связана только с конструктором no-arg по умолчанию, который не сгенерирован, если есть какое-либо определение конструктора. Но это не так трудно не предоставить конструктор без аргументов, который ведет себя так же, как генерируется один:

class yourClass 
{ 
    public: 
     yourClass(){} 
} 
+0

Я думаю, вы хотите поставить 'public:' над конструктором, а не как ключевое слово стиля Java/C#. – AshleysBrain

+0

Я больше ссылался на конструктор копирования ... который немного больше кода, если у вас много свойств. –

+0

@AshleyBrain @Itay Moav: спасибо. Я работаю на Java сейчас, так что мои привычки меняются :-) –

Смежные вопросы