Arturr300 Temat założony przez niniejszego użytkownika |
Wskaźnik na obiekt klasy jako pole innej klasy » 2012-10-24 17:40:16 Witam. Mam 2 klasy: Menu i Przycisk. Chciałbym utworzyć w klasie Menu wskaźnik na obiekt klasy Przycisk więc robię tak w pliku Menu.h: (dodaję najważniejsze fragmenty) public: Przycisk * Przycisk2; A w konstruktorze dodaję: Przycisk1 = new Przycisk( 500, 400, "Single Player" ); I wyskakuje błąd: error C4430: brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Jak to naprawić? Oczywiście wszystkie pliki do siebie dołączyłem. Używam VS Express 2012 for Desktop PL |
|
jsc |
» 2012-10-24 17:44:24 Może pokażesz kod obu klas? |
|
Arturr300 Temat założony przez niniejszego użytkownika |
a » 2012-10-24 17:48:08 Menu.h: #pragma once #include "gui.h"
class Menu : public Gui { public: Menu( void ); virtual ~Menu( void ); void Wyswietl( SDL_Surface *& ekran ); Przycisk * Przycisk1; Przycisk * Przycisk2; protected: TTF_Font * menu_font; };
Menu.cpp: #include "Menu.h" #include "przycisk.h"
Menu::Menu( void ) { menu_font = TTF_OpenFont( "font/menu.ttf", 20 ); if( !font ) { fprintf( stderr, "TTF_OpenFont: %s\n", TTF_GetError() ); exit( 1 ); } Przycisk1 = new Przycisk( 500, 400, "Single Player" ); Przycisk2 = new Przycisk( 200, 800, "Wyjscie" ); }
Menu::~Menu( void ) { }
void Menu::Wyswietl( SDL_Surface *& ekran ) { Przycisk1->Wyswietl( ekran ); Przycisk2->Wyswietl( ekran ); }
Przycisk.h: #pragma once #include "menu.h" class Przycisk : public Menu { public: Przycisk( int x, int y, string napis ); ~Przycisk( void ); void Wyswietl( SDL_Surface *& ekran ); SDL_Surface * button; SDL_Surface * tlo; SDL_Surface * tekst; string napis; SDL_Rect Dest; SDL_Rect Dest2; };
Przycisk.cpp: #include "Przycisk.h"
Przycisk::Przycisk( int x, int y, string napis ) { tlo = IMG_Load( "img/menu/bg.png" ); button = IMG_Load( "img/menu/button.png" ); tekst = TTF_RenderText_Solid( menu_font, napis.c_str(), kolor ); Dest.x = x; Dest.y = y; Dest2.x =( x + button->w / 2 ) -( tekst->w / 2 ); Dest2.y =( y + button->h / 2 ) -( tekst->h / 2 ); }
Przycisk::~Przycisk( void ) { }
void Przycisk::Wyswietl( SDL_Surface *& ekran ) { SDL_BlitSurface( tlo, 0, ekran, 0 ); SDL_BlitSurface( button, 0, ekran, & Dest ); SDL_BlitSurface( tekst, 0, ekran, & Dest2 ); }
Edit: Gdy dołączę do Menu.h plik Przycisk.h, to pokazuje się: 1>\stick craft\menu.h(13): error C2143: błąd składniowy: brakuje ";" przed "*" 1>\stick craft\menu.h(13): error C4430: brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int 1>\stick craft\menu.h(14): error C2143: błąd składniowy: brakuje ";" przed "*" 1>\stick craft\menu.h(14): error C4430: brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int 1> Menu.cpp 1>\stick craft\przycisk.h(5): error C2504: "Menu" : klasa podstawowa niezdefiniowana 1> Gra.cpp 1>\stick craft\przycisk.h(5): error C2504: "Menu" : klasa podstawowa niezdefiniowana |
|
crash |
» 2012-10-24 18:05:49 W przycisk.cpp dorzuć #include "menu.h"
Nie wiem czy pomoże, bo nie kompilowałem - nie mam SDL. Druga sprawa, w lewym górnym rogu klawiatury jest przycisk ESC, dwa przyciski poniżej jest przycisk, który ma takie dwie strzałki i nazywa się TAB. Używaj go do formatowania kodu, zwłaszcza jeśli ktoś ma po Tobie kod czytać. |
|
Admixior |
» 2012-10-24 22:39:06 Jak możesz to podeślij kawałek lub cały kod "gui.h" bo coś mi się wydaje że połączenie tych wszystkich plików jest niezbyt dobre. Mam namyśli że jak raz dołączysz gdzieś kod menu.h to przez "pragma once" kompilator zapamięta że już ten plik dołączałeś. Co z tego że nie tutaj (przycisk.h) tylko gdzieś indziej (np w pliku gui.h). PS(dla innych). Problem nie dotyczy w sytuacjach gdy dołączamy 2 różne pliki *.cpp (przy przechodzeniu z jednego do drugiego preprocesor usuwa sobie wszystkie informacje o definicjach. PS2. Jeśli nadal nie wiesz w czym jest błąd to zamień sobie #pragma once" na klasyczny "strażnik nagłówka". I zwróć uwagę na to że preprocesor zapamiętuje #define z jednego pliku na cały plik *.cpp który właśnie kompiluje #ifndef __MENU__H__ #define __MENU__H__
#endif
W skrócie za drugim razem warunek ifndef (if not defined) nie będzie spełniony bo wcześniej zdefiniowaliśmy(przy poprzednim inkludowaniu pliku) |
|
krzyk |
» 2012-10-25 15:06:59 Myślę że problemem jest hierarchia klas.
Dlaczego podrzędna klasa Menu musi znać nadrzędną Przycisk?
|
|
Arturr300 Temat założony przez niniejszego użytkownika |
» 2012-10-25 15:24:37 Jeżeli w pliku Menu.cpp zrobię te wskaźniki, to wszystko działa. Natomiast w pliku Menu.h już nie. Czy nie można dołączać plików nagłówkowych wielokrotnie? Zauważyłem, że w plikach .cpp mogę dołączać nagłówki wielokrotnie, a w plikach nagłówkowych tylko w jednym pliku jeden raz... @crash Nic to nie dało - jeszcze więcej błędów. @krzyk W celu utworzenia obiektu klasy Przycisk, bez tego po prostu nie wykrywa klasy Przycisk. @Admixior Hierarchia klas wygląda następująco: Gra Gui Menu Przycisk Gra.h: #pragma once #include <iostream> #include <conio.h> #include <SDL.h> #include <SDL_ttf.h> #include <SDL_image.h> #include <SDL_thread.h> #include "Settings.h" #include <sstream>
enum ZDARZENIA { z_NIC, z_WYJSCIE, z_MENU, z_SP, z_MP };
using namespace std; class Gra { public: Gra( void ); virtual ~Gra( void ); SDL_Event Zdarzenie; void Game( void ); Uint8 * keystate; int debug; protected: TTF_Font * font; ZDARZENIA z_Zdarzenie; public: ZDARZENIA Zdarzenia( void ); };
void Game(); Gra.cpp (początek, bo całość zajmuje dużo miejsca): #include "Gra.h" #include "Ekran.h" #include "Dzwiek.h" #include "Npc.h" #include "Player.h" #include "Gui.h" #include "Menu.h"
#include "SDL_rotozoom.h" #include "SDL_rotozoom.c"
Gra::Gra( void ) { keystate = SDL_GetKeyState( NULL ); debug = 0; if( TTF_Init() != 0 ) { fprintf( stderr, "Nie mozna uzyskac dostepu do SDL_TTF: %s\n", TTF_GetError() ); exit( 1 ); } font = TTF_OpenFont( "font/arial.ttf", 20 ); if( !font ) { fprintf( stderr, "TTF_OpenFont: %s\n", TTF_GetError() ); exit( 1 ); } }
Gra::~Gra( void ) { }
Gui.h: #pragma once #include "gra.h" class Gui : public Gra { public: Gui( void ); virtual ~Gui( void ); void WyswietlFPS_p1( void ); void WyswietlFPS_p2( SDL_Surface * & ekran ); protected: int start_time; int frame_time; public: stringstream ss_fps; protected: int fps; SDL_Surface * t_fps; SDL_Color kolor; };
|
|
DejaVu |
» 2012-10-25 15:30:02 |
|
« 1 » 2 |