Как я могу заставить компилятор создавать конструкторы по умолчанию в C ++? - PullRequest
1 голос
/ 27 апреля 2010

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

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

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

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

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

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

2 голосов
/ 27 апреля 2010

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

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

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

1 голос
/ 27 апреля 2010

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

class yourClass
{
    public:
       yourClass(){}
}
...