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編集:クラスにはデフォルトのコンストラクターがないことに言及するのを忘れていました。それが何かを変えるかどうかはわかりません

4

3 に答える 3

10

次のいずれかに該当する場合、デフォルトのコンストラクターは生成されません。

  • 宣言されたユーザー定義のコンストラクターがあります
  • タイプにはconstまたは参照フィールドがあります

コンストラクターを宣言したため、C++はデフォルトで生成されたコンストラクターを提供しません。この場合、のすべてのフィールドにTileset便利なデフォルトコンストラクターがあるため、ここでデフォルトコンストラクターを定義するのは非常に簡単です。

Tileset() { }
于 2012-05-17T15:21:01.583 に答える
1

コンストラクターを指定しない場合にのみ、コンパイラーはクラスのデフォルトコンストラクターを生成します。コンストラクター(コピーコンストラクターも含む)を指定すると、コンパイラーはデフォルトのコンストラクターを生成しません。

「提供する」とは、クラスでコンストラクターを宣言し、「オプションで」定義することを意味します。

于 2012-05-17T15:19:47.450 に答える
1

C++ 仕様、12.1.5 から

クラス X に対してユーザーが宣言したコンストラクターがない場合は、既定のコンストラクターが暗黙的に宣言されます。暗黙的に宣言された既定のコンストラクターは、inline publicそのクラスのメンバーです。

Tilesetクラスがコンストラクターを宣言したため、C++ コンパイラーは暗黙のコンストラクターを宣言しませんでした。この動作の根拠は、パラメーターを受け取るコンストラクターを提供したため、クラスのインスタンスを適切に初期化するためにこれらのパラメーターが必要になる可能性があるためです。ここでの前提は、デフォルト以外のコンストラクターに加えてデフォルトのコンストラクターが必要な場合は、単純に宣言することです。

于 2012-05-17T15:24:07.400 に答える