2013-08-10 2 views
-2

Как сделать, чтобы главный класс file_x.h и file_x.cpp, а затем производный класс из класса, сделанный в file_x, в file_y.h и file_y.cppполученных clases в разных файлах C++

Я пробовал много вещей без каких-либо хороших результатов. Не могли бы вы привести пример с обоими классами со своей конструкторской функцией, переменной и регулярной функцией в обоих классах?

У меня есть это в 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; 

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*); 
     ~bwindow(); 
     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; 

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

bwindow::~bwindow(){ 

} 

это в window_types.h (производный класс заголовок):

#ifndef WINDOW_TYPES_H_ 
#define WINDOW_TYPES_H_ 

#include <string> 
#include <vector> 
#include "window.h" 

using namespace std; 

namespace windows{ 
    class message_window : public bwindow{ 
     private: 
      vector <string> message; 
      string title; 
     public: 
      message_window(); 
      void start(string,vector<string>,int); 
      void test(); 
    }; 
} 

#endif /* WINDOW_TYPES_H_ */ 

И это в window_types.cpp (Где я получаю ошибку «нет функции согласования для вызова«bwindow :: bwindow () "):

#include <string> 
#include <vector> 

#include "../../utils/utilsf.h" 

#include "window_types.h" 


using namespace std; 
//HERE THE ERROR 
windows::message_window::message_window(){ 

} 
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); 
} 
void windows::message_window::test(){ 

} 
+1

Не могли бы вы привести пример того, что вы пробовали? –

+2

Можно, конечно, сделать, поэтому вам определенно нужно показать какой-то код и более подробно объяснить, какие проблемы вы видите. –

+0

что вы пробовали? в чем проблема ? компиляция ошибки связывания ошибок или что? –

ответ

0

Ваши #includes в порядке. Однако вы не инициализируете свои экземпляры объектов правильно. Вы должны инициализировать базовый класс в конструкторе производного класса - и нигде больше! Более того, вы не можете вызвать базовый конструктор в теле производного конструктора. Для этого C++ использует специальную конструкцию, называемую 'initialization list'. Он обозначается точкой с запятой после параметров и перед телом конструктора. См. What does a colon following a C++ constructor name do? для более подробной информации.

Поскольку вы не инициализировать bwindow в конструкторе message_window, C++ компилятор вставил неявный вызов конструктора по умолчанию, то есть bwindow::bwindow(). Но поскольку такой конструктор не существует, вы получаете ошибку компилятора.

message_window конструктор должен выглядеть примерно так:

void windows::message_window::message_window(string title, 
            vector <string> content, 
            int s, int a[], int b[]) 
: bwindow(title, 300, 200, 100, 50, a, b), 
    name(title), 
    contents(content) 
{ 
    // the constructor body is empty in this case 
} 

Обратите внимание, что вы не можете инициализировать a и b массивов, как вы делали раньше. Вероятно, вызывающий абонент message_window уже сделал это.

Аналогичным образом bwindow конструктор should use an initialization list это:

bwindow::bwindow(string title,int xp,int yp,int w,int h,int a[], int b[]) 
: x(xp), y(yp), sx(x), sy(y), name(title), pressed(false) 
{ 
    //setting masks 
    Uint32 rmask = 0x00000000; 
    Uint32 gmask = 0x00000000; 
    Uint32 bmask = 0x00000000; 
    Uint32 amask = 0x00000000; 

    //rest of the of the code omitted 
} 

Sidenote: Вы должны declare your destructors as virtual.

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