2015-02-03 2 views
1

Привет всем, хотя было бы весело провести время, чтобы попытаться создать треугольник Серпинского, и у меня возникла проблема с этой абстрактной ошибкой класса, которую я не могу понять. Когда я пытаюсь сделать «СерпинскиТри» «СерпинскиТри серпинский»; объект, а затем нарисуйте его в окне «window.draw (sierpinskiii)»; я получаю сообщение об ошибке на этом объекте говоря, что это абстрактный классАбстрактная ошибка класса в C++ SFML

class SierpinskiTri : public sf::Drawable{ 
public : 

SierpinskiTri(sf::RenderWindow &window):m_window(window) { 
    //filledTriangle(300, 400, 300); 
    sierpinski(3 ,300, 0,300); 
    } 

virtual void sierpinski(int n, double x, double y, double s){ 

     filledTriangle(x, y, s); 
     sierpinski(n-1, x - s/2, y, s/2); 
     sierpinski(n-1, x + s/2, y, s/2); 
     sierpinski(n-1, x, y+sqrt(3)/2*s, s/2); 

    if(n == 0) 
    { 
     return; 
    } 
} 


virtual void filledTriangle(float x, float y, float s){ 
    float* xl = new float[4]; 
    xl[0] = x - s/2; xl[1]= x + s/2; xl[2] = x; xl[3] = x-s/2; 
    float* yl = new float[4]; 
    yl[0] = sqrt(3)/2*s+y; yl[1] = yl[0]; yl[2] = y; yl[3] = yl[0]; 

    draw(xl,yl,m_window); 

} 
private: 
sf::RenderWindow &m_window; 

virtual void draw(float xl[],float yl[],sf::RenderWindow &window) const { 

sf::VertexArray triangle(sf::Triangles, 3); 

triangle[0].position = sf::Vector2f(xl[0],yl[1]); 
triangle[0].color = sf::Color::Blue; 
triangle[1].position = sf::Vector2f(xl[1],yl[1]); 
triangle[1].color = sf::Color::Red; 
triangle[2].position = sf::Vector2f(xl[2],xl[2]); 
triangle[2].color = sf::Color::White; 
window.draw(triangle); 
} 


}; 

ответ

3

Когда вы унаследовали от Drawable:

class SierpinskiTri : public sf::Drawable { .. }; 

вы также наследуют все его методы, один из которых является:

virtual void draw (RenderTarget &target, RenderStates states) const = 0; 

Вы не предоставляете реализацию draw, поэтому ваш класс SierpinksiTri также является абстрактным классом, и вы не можете создать экземпляр абстрактного класса.

Решение должно обеспечить реализацию для draw().

2

По documentation вы должны переопределить эту функцию:

virtual void sf::Drawable::draw(RenderTarget& target 
           , RenderStates states) const; 

Вы написали эту функцию:

virtual void draw(float xl[] 
       , float yl[] 
       , sf::RenderWindow &window) const; 

В результате производный класс является абстрактным, как компилятор говорит. Чтобы переопределить, вам нужно правильно подобрать подпись виртуальной функции.

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