Вопрос по c++, constructor – При каких условиях генерируется конструктор по умолчанию?

4

У меня есть следующий класс:

class Tileset { //base class

public:
    static std::vector<Tileset*> list;
    virtual ~Tileset() = 0;

protected:
    std::vector<Tile> tiles_list;
    sf::Texture sheet;

private: //non copiable
    Tileset(const Tileset&);
    Tileset& operator=(const Tileset&);
};

гдеsf::Texture имеет конструктор по умолчанию

Насколько я понимаю, конструктор по умолчанию должен быть сгенерирован, так как каждый член может быть построен по умолчанию тоже. Тем не менее у меня есть ошибка компилятора, когда я пытаюсь создать производный объект без вызоваTileset конструктор. Может кто-нибудь объяснить, почему не создается конструктор по умолчанию?

редактировать: забыл упомянуть, чтоTile У класса нет конструктора по умолчанию. Я не уверен, что это что-то меняет

Возможный дубликат?stackoverflow.com/questions/1585708/… (для вашего копирования конструктор отключает создание проблемы конструктора по умолчанию) wkl

Ваш Ответ

3   ответа
1

If there is no user-declared constructor for class X, a default constructor is implicitly declared. An implicitly-declared default constructor is an inline public member of its class.

ВашTileset Класс объявил конструктор, поэтому компилятор C ++ не объявил для вас неявный конструктор. Обоснование этого поведения заключается в том, что, поскольку вы предоставили конструкторы, которые принимают параметры, вам, вероятно, нужны эти параметры для правильной инициализации экземпляра вашего класса. Здесь предполагается, что если вы хотите использовать конструктор по умолчанию в дополнение к конструктору, не являющемуся конструктором по умолчанию, вы просто объявите его.

Error: User Rate Limit Exceeded lezebulon
Error: User Rate Limit Exceeded
10

если выполнено любое из следующего

There is a user defined constructor declared The type has a const or reference field

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

Tileset() { }
Error: User Rate Limit Exceeded lezebulon
Error: User Rate Limit Exceeded lezebulon
Error: User Rate Limit Exceededboost::noncopyable.
Error: User Rate Limit Exceeded lezebulon
Error: User Rate Limit Exceeded
1

только тогда компилятор генерирует конструктор по умолчанию для вашего класса. Если вы предоставите конструктор (даже конструктор копирования), то компилятор не будет генерировать конструктор по умолчанию.

"Предоставить" Я имею в виду, когда тыdeclare и "необязательно"define конструктор в вашем классе.

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