2016-02-28 109 views
-1

我正在制作一个游戏(在OpenGL/SDL中),其中有一般实体和派生自实体类的特定对象。我有一个这样的子弹派生类。下面是实体和子弹类的定义:创建派生类构造函数时出错

class Entity { 
public: 
    Entity(ShaderProgram program): program(program){} 
    void Draw() { 

    } 
    void Update(float elapsed) { 
     // move stuff and check for collisions 
    } 
    void Render() { 
     // for all game elements 
     // setup transforms, render sprites 
    } 
    float x; 
    float y; 
    float rotation; 
    int textureID; 
    float width; 
    float height; 
    float speed; 
    float direction_x; 
    float direction_y; 
    ShaderProgram program; 
    GLuint spriteSheetTexture = LoadTexture("sheet.png"); 
    SheetSprite mySprite = SheetSprite(spriteSheetTexture, 241.0f/1024.0f, 941.0f/1024.0f, 99.0f/1024.0f, 75.0f /1024.0f, 0.2, program); 
}; 

class Bullet : public Entity { 
public: 

    Bullet(ShaderProgram program, float angle, float timeAlive) : program(program), angle(angle), timeAlive(timeAlive){} 

    float angle; 
    float timeAlive; 
    ShaderProgram program; 
}; 

由于派生类不继承构造函数,我为子弹类的另一个构造(初始化同一个程序作为基类)。出于某种原因,我在派生类中的初始化列表后的左大括号中得到了预编译错误:No default constructor exists for class "Entity"

它可能只是我一直在看代码太久,但我相当肯定,我已经正确地初始化了派生类中的所有内容,并且没有使用任何默认构造函数。什么可能导致错误?

回答

1

除非您明确提供基类构造函数的参数,否则将使用基类的默认构造函数。你想这样的:

Bullet(ShaderProgram program, float angle, float timeAlive) : 
Entity(program), angle(angle), timeAlive(timeAlive) {} 

而且你可能不希望在派生类program,因为它是从实体继承。

+0

噢好吧,但没有默认的构造函数意味着没有指定时使用的构造函数?而且,为了确认,只要你指定一个派生类构造函数,其中基类的变量需要被初始化,你应该使用基类来初始化变量(例如'''Entity(program)''') – loremIpsum1771

+0

@ loremIpsum1771:默认的构造函数是可以不带参数调用的构造函数。是的,你通常应该让基类初始化基类的成员,而不是试图在派生类中初始化它们。 –

+0

因此,基本上,如果基类具有非空ctor参数,则派生类中的相应参数必须由基类ctor初始化。 – loremIpsum1771

相关问题