2016-02-28 70 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

相關問題