虚函数错误(vtable?)

时间:2013-08-13 14:53:23

标签: c++ class function header vtable

好吧,我收到错误,因为我添加了虚拟功能,我不知道它。你呢?

总共有三个错误:

  1. window.h:22:未定义引用“vtable for bwindow”
  2. window.cpp:16:未定义引用`vtable for bwindow
  3. window_types.cpp:22:对windows :: message_window
  4. 的vtable的未定义引用

    这里是错误代码文件:

    window.h中

    #ifndef WINDOW_H_
    #define WINDOW_H_
    
    #include <string>
    #include <vector>
    
    #include "SDL/SDL.h"
    #include "SDL/SDL_ttf.h"
    
    #include "../../utils/event.h"
    #include "../../utils/button.h"
    
    using namespace std;
    //ERROR HERE "undefined reference to `vtable for bwindow'"
    class bwindow{
        protected:
            SDL_Surface* up_bar;
            SDL_Surface* content;
            SDL_Surface* to_blit;
            SDL_Surface* text;
    
            vector <button*> botns;
    
            string name;
            int x;
            int y;
    
            bool pressed;
            int sx;
            int sy;
        public:
            bwindow(string,int,int,int,int,int*,int*);
            void graphic_update(SDL_Surface*);
            void logic_update(events*);
            virtual void pgu(SDL_Surface*);
            virtual void plu(events*);
    
            string get_name();
    };
    #endif /* WINDOW_H_ */
    
    window.cpp:
    
    #include <string>
    #include <vector>
    #include <iostream>
    
    #include "SDL/SDL.h"
    #include "SDL/SDL_gfxPrimitives.h"
    #include "SDL/SDL_ttf.h"
    
    #include "../../utils/SDL_functions.h"
    #include "../../utils/event.h"
    #include "../../extra_data/extra_data.h"
    #include "window.h"
    
    using namespace std;
    //ERROR HERE "undefined reference to `vtable for bwindow'"
    bwindow::bwindow(string title,int xp,int yp,int w,int h,int a[], int b[]){
    
        //seting variables
        x = xp;
        y = yp;
        sx = x;
        sy = y;
        name = title;
        pressed = false;
    
    
        //seting masks
        Uint32 rmask = 0x00000000;
        Uint32 gmask = 0x00000000;
        Uint32 bmask = 0x00000000;
        Uint32 amask = 0x00000000;
    
        //creating up_bar
        up_bar = SDL_CreateRGBSurface(SDL_SWSURFACE, w, 20, 32,rmask, gmask, bmask, amask);
        SDL_FillRect( up_bar, &up_bar->clip_rect, SDL_MapRGB( up_bar->format, 0xFF, 0xFF, 0xFF ) );
        boxRGBA(up_bar   ,0, 0, w,20,a[0],a[1],a[2],a[3]);
        //creating content area
        content = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h-30, 32,rmask, gmask, bmask, amask);
        boxRGBA(content,0, 0,w, h - 25,b[0],b[1],b[2], b[3]);
        //adding borders
        sdlf::add_border(up_bar,1,1,1,1,0,0,0,255);
        sdlf::add_border(content,1,1,1,1,0,0,0,255);
    
        //adding the up-text
        SDL_Color textColor = { 0 , 0 ,0  };
    
        TTF_Font *font;
        font =  fonts::load_john_han(15);
    
        text = TTF_RenderText_Solid(font,title.c_str(),textColor);
    
        apply_surface(20,5,text,up_bar);
    
        //creating final surface
        to_blit = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,rmask, gmask, bmask, amask);
    }
    void bwindow::graphic_update(SDL_Surface* screen){
    
        SDL_FillRect( to_blit, &to_blit->clip_rect, SDL_MapRGB( to_blit->format, 0xFF, 0xFF, 0xFF ) );
    
    
    
    
        apply_surface(0,0, up_bar, to_blit);
        apply_surface(0,20,content,to_blit);
    
        apply_surface(x,y,to_blit,screen);
    
    }
    void bwindow::logic_update(events* evs){
        mouse m = evs->get_mouse();
    
        bool condition1 = m.x > x and m.x < x + up_bar->w;
        bool condition2 = m.y > y and m.y < y + up_bar->h;
        bool condition3 = m.left;
        if (condition1 and condition2){
            if (condition3 and pressed == false){
                pressed = true;
                sx = m.x - x;
                sy = m.y - y;
            }else if (not(condition3)){
                pressed = false;
            }
        }
        if (condition3 and pressed == true){
            x =   (m.x - sx) ;
            y =   (m.y - sy) ;
        }
    }
    
    string bwindow::get_name(){
        return name;
    }
    

    window_types.h(此文件中没有错误)

    /*
     * window_types.h
     *
     *  Created on: Aug 10, 2013
     *      Author: newtonis
     */
    
    #ifndef WINDOW_TYPES_H_
    #define WINDOW_TYPES_H_
    
    #include <string>
    #include <vector>
    
    #include "SDL/SDL.h"
    #include "SDL/SDL_gfxPrimitives.h"
    #include "SDL/SDL_ttf.h"
    #include "../../utils/SDL_functions.h"
    
    #include "window.h"
    #include "../../extra_data/extra_data.h"
    
    using namespace std;
    
    namespace windows{
    
    
        class message_window : public bwindow{
            private:
                vector <string> message;
                string title;
            public:
                message_window(string,string,int a[],int b[]);
    
                void pgu(SDL_Surface* SCREEN);
                void plu(events ev);
    
                void start(string,vector<string>,int);
                void test();
    
        };
    
        message_window* get_message_window(string,string,int);
    
    }
    
    #endif /* WINDOW_TYPES_H_ */
    

    window_types.cpp(这是一个错误)

    #include <string>
    #include <vector>
    #include <iostream>
    
    #include "SDL/SDL.h"
    #include "SDL/SDL_gfxPrimitives.h"
    #include "SDL/SDL_ttf.h"
    #include "../../utils/SDL_functions.h"
    
    #include "../../utils/utilsf.h"
    #include "../../extra_data/extra_data.h"
    
    #include "window.h"
    #include "window_types.h"
    
    
    using namespace std;
    
    
    namespace windows{
    //ERROR HERE "vtable for windows::message_window"
    message_window::message_window(string title,string con,int a[],int b[]) : bwindow(title, 300, 200, 150, 100,a,b){
        vector <string> content_ordered;
        string new_lines = "";
    
        for (int x = 0;x < con.size();x++){
            if (x < con.size()-1){
                if (utilsf::cts(con[x]) == "/" and utilsf::cts(con[x+1]) == "r"){
                    content_ordered.push_back(new_lines);
                    new_lines = "";
                    x+=2;
                }
            }
            if (utilsf::cts(con[x]) == ""){
                new_lines = new_lines + " ";
            }
            new_lines = new_lines + utilsf::cts(con[x]);
    
            if (x == con.size()-1){
                content_ordered.push_back(new_lines);
            }
        }
    
        SDL_Color textColor = {0, 0, 0};
    
        TTF_Font *font = fonts::load_font1(15);
        int h = 3;
        for (int x = 0;x < content_ordered.size();x++){
            SDL_Surface* text_surface =  TTF_RenderText_Solid(font,content_ordered[x].c_str(),textColor);
    
            apply_surface(5,h,text_surface,content);
            h += text_surface->h + 3;
        }
    }
    /*void windows::message_window::start(string title,vector <string> content,int s){
        int yp = 200;
        int xp = 300;
        int w = 100;
        int h = 50;
        int a[4];
        int b[4];
    
        a[0] = utilsf::randrange(0,256,s);
        a[1] = utilsf::randrange(0,256,s);
        a[2] = 200;
        a[3] = 255;
    
        b[0] = 200;
        b[1] = utilsf::randrange(0,256,s);
        b[2] = utilsf::randrange(0,256,s);
        b[3] = 255;
    
        bwindow(title,xp,yp,w,h,a,b);
    }*/
    message_window* get_message_window(string title,string msj,int s){
        int a[4];
        int b[4];
    
        a[0] = utilsf::randrange(0,256,s);
        a[1] = utilsf::randrange(0,256,s);
        a[2] = 200;
        a[3] = 255;
    
        b[0] = 200;
        b[1] = utilsf::randrange(0,256,s);
        b[2] = utilsf::randrange(0,256,s);
        b[3] = 255;
        message_window *w = new message_window(title,msj,a,b);
        return w;
    }
    
    }
    

1 个答案:

答案 0 :(得分:1)

您需要实施void bwindow::pgu(SDL_Surface*)void bwindow::plu(events*),或将其设为纯虚拟:

virtual void pgu(SDL_Surface*) = 0;
virtual void plu(events*) = 0;

使用纯虚方法,您将无法实例化bwindow个对象,但只要方法在这些类型中实现,就可以实例化派生类型。

详情请见pure virtual methods here