我有以下课程:
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
类没有默认构造函数。我不确定这是否会改变任何内容
答案 0 :(得分:10)
如果满足以下任何条件,则不会生成默认构造函数
const
或参考字段您声明了构造函数,因此C ++不会提供默认生成的构造函数。在这种情况下,尽管Tileset
的所有字段都有有用的默认构造函数,因此在这里定义默认构造函数非常容易
Tileset() { }
答案 1 :(得分:1)
当您不提供任何构造函数时,只有编译器才会为您的类生成默认构造函数。如果提供构造函数(甚至是复制构造函数),则编译器将不会生成默认构造函数。
通过“提供”我的意思是当你声明和“可选地”定义你班级的构造函数时。
答案 2 :(得分:1)
来自C ++规范,12.1.5
如果类X没有用户声明的构造函数,则隐式声明默认构造函数。 隐式声明的默认构造函数是其类的
inline public
成员。
您的Tileset
类声明了构造函数,因此C ++编译器没有为您声明隐式构造函数。这种行为的基本原理是,由于您提供了带参数的构造函数,因此您可能需要这些参数才能正确初始化类的实例。这里的假设是,除了非默认构造函数之外,如果你想要一个默认构造函数,你只需要声明它。