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&);
};

wheresf::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 回答