Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的抽象类错误+;SFML_C++_Abstract Class_Sfml - Fatal编程技术网

C++ C+中的抽象类错误+;SFML

C++ C+中的抽象类错误+;SFML,c++,abstract-class,sfml,C++,Abstract Class,Sfml,大家好,我想尝试制作一个Sierpinski三角形会是一个有趣的练习,我对这个抽象类错误有一个问题,我似乎无法解决。当我试图创建一个SierpinskiTri“SierpinskiTri-sierpinskiii;”对象,然后将其绘制到窗口“window.draw(sierpinskiii);”时,我在该对象上得到一个错误,说它是一个抽象类 class SierpinskiTri : public sf::Drawable{ public : SierpinskiTri(sf::RenderW

大家好,我想尝试制作一个Sierpinski三角形会是一个有趣的练习,我对这个抽象类错误有一个问题,我似乎无法解决。当我试图创建一个SierpinskiTri“SierpinskiTri-sierpinskiii;”对象,然后将其绘制到窗口“window.draw(sierpinskiii);”时,我在该对象上得到一个错误,说它是一个抽象类

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);
}


};
当您继承自:

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);
}


};
您还可以继承其所有方法,其中之一是:

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);
}


};
virtual void draw (RenderTarget &target, RenderStates states) const = 0;
您没有提供
draw
的实现,因此您的
SierpinksiTri
类也是一个抽象类,您无法创建抽象类的实例

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);
}


};
解决方案是为
draw()
提供一个实现

当您继承自:

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);
}


};
您还可以继承其所有方法,其中之一是:

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);
}


};
virtual void draw (RenderTarget &target, RenderStates states) const = 0;
您没有提供
draw
的实现,因此您的
SierpinksiTri
类也是一个抽象类,您无法创建抽象类的实例

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);
}


};
解决方案是为
draw()
提供一个实现

您必须覆盖该功能:

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);
}


};
virtual void sf::Drawable::draw( RenderTarget& target
                               , RenderStates states ) const;
virtual void draw( float xl[]
                 , float yl[]
                 , sf::RenderWindow &window ) const;
您已经编写了该函数:

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);
}


};
virtual void sf::Drawable::draw( RenderTarget& target
                               , RenderStates states ) const;
virtual void draw( float xl[]
                 , float yl[]
                 , sf::RenderWindow &window ) const;
结果,派生类是抽象的,就像编译器所说的那样。为了重写,您需要正确匹配虚拟函数的签名

您必须覆盖该功能:

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);
}


};
virtual void sf::Drawable::draw( RenderTarget& target
                               , RenderStates states ) const;
virtual void draw( float xl[]
                 , float yl[]
                 , sf::RenderWindow &window ) const;
您已经编写了该函数:

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);
}


};
virtual void sf::Drawable::draw( RenderTarget& target
                               , RenderStates states ) const;
virtual void draw( float xl[]
                 , float yl[]
                 , sf::RenderWindow &window ) const;
结果,派生类是抽象的,就像编译器所说的那样。为了重写,您需要正确匹配虚拟函数的签名

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);
}


};