SomeClass * initialEl = new SomeClass [5]; - PullRequest
0 голосов
/ 15 июля 2010

Если SomeClass * initialEl = new SomeClass [5]; обязательно компилировать, предполагая, что SomeClass не имеет публично объявленного конструктора по умолчанию? Рассмотрим:

/*
 * SomeClass.h
 *
 */

#ifndef SOMECLASS_H_
#define SOMECLASS_H_

class SomeClass
{

public:
    SomeClass(int){}
    ~SomeClass(){}
};

#endif /* SOMECLASS_H_ */


/*
 * main.cpp
 *
 */

#include "SomeClass.h"

int main()
{
    SomeClass* initialEl = new SomeClass[5];

    delete[] initialEl;

    return 0;
}

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

Предполагая, что SomeClass имеет общедоступный конструктор по умолчанию, да.

Обратите внимание, что есть разница между

  1. , имеющим общедоступный конструктор по умолчанию (что я сказал) и
  2. не имеет публично объявленного конструктора по умолчанию (что вы сказали)

Для следующего класса 2. - true, но 1. не является:

class A {
    SomeClass(const SomeClass&) {}
};

Это связано с §12.1 / 5 (C ++ 03):

Если нет объявленный пользователем конструктор для класса X, конструктор по умолчанию объявляется неявно.Неявно объявленный конструктор по умолчанию является членом inline public своего класса.


С вашим обновлением SomeClass не имеет конструктора по умолчанию.Вы не объявили один и потому что вы объявили другой конструктор, компилятор также не объявит его неявно.

Если вам нужен один, вы должны реализовать его самостоятельно:

class A {
public:
    SomeClass(int) {}
    SomeClass() {}
};

Илипусть другой конструктор квалифицируется как конструктор по умолчанию:

class A {
public:
    SomeClass(int=0) {}
};
1 голос
/ 15 июля 2010

Нет, он не будет компилироваться без конструктора по умолчанию. В этом случае нет конструктора по умолчанию, созданного компилятором, потому что вы определили другой конструктор. «Компилятор попытается сгенерировать его, если это необходимо, и если пользователь не объявил другие конструкторы». - Язык программирования C ++ , Страуструп

Если вы действительно хотите использовать new SomeClass[5], вам придется также предоставить конструктор по умолчанию.

...