0

好吧,我收到了一个错误,因为我添加了我不知道的虚函数。你?

总共有三个错误:

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

这里是错误代码文件:

窗口.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;
}

}
4

1 回答 1

1

您需要实现void bwindow::pgu(SDL_Surface*)and void bwindow::plu(events*),或者使它们成为纯虚拟的:

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

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

在此处查看有关纯虚拟方法的更多信息

于 2013-08-13T14:57:26.247 回答