2016-02-28 2 views
-1

Я делаю игру (в OpenGL/SDL), где есть общие объекты и конкретные объекты, которые получены из класса Entity. У меня есть один такой производный класс для пуль. Вот определение для классов сущностей и Пуль:Ошибка при создании конструктора производного класса

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 в производном классе, так как он унаследован от Entity.

+0

О, хорошо, но не по умолчанию конструктор означает конструктор, который используется, когда ни один не указан? Кроме того, просто для подтверждения, когда вы укажете конструктор производного класса, в котором должны быть инициализированы переменные из базового класса, вы должны использовать базовый класс для правильной инициализации переменных (например, '' 'Entity (program)' '') – loremIpsum1771

+0

@ loremIpsum1771: Конструктор по умолчанию - это тот, который можно вызвать без параметров. И да, вы обычно должны позволить базовому классу инициализировать члены базового класса, а не пытаться инициализировать их в производном классе. –

+0

Итак, в основном, если базовый класс имеет непустые параметры ctor, то соответствующие параметры в производном классе должны быть инициализированы базовым классом ctor. – loremIpsum1771

Смежные вопросы