Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźnik na obiekt klasy jako pole innej klasy

Ostatnio zmodyfikowano 2012-10-25 15:40
Autor Wiadomość
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)

C/C++
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
P-67384
jsc
» 2012-10-24 17:44:24
Może pokażesz kod obu klas?
P-67387
Arturr300
Temat założony przez niniejszego użytkownika
a
» 2012-10-24 17:48:08
Menu.h:
C/C++
#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:
C/C++
#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:
C/C++
#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:
C/C++
#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
P-67388
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ć.
P-67389
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
C/C++
#ifndef __MENU__H__
#define __MENU__H__

//kod cpp

#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)
P-67441
krzyk
» 2012-10-25 15:06:59
Myślę że problemem jest hierarchia klas.

Dlaczego podrzędna klasa Menu musi znać nadrzędną Przycisk?
P-67461
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:
C/C++
#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):
C/C++
#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 ); } /* 0 sukces, -1 porażka */
    font = TTF_OpenFont( "font/arial.ttf", 20 ); if( !font ) { fprintf( stderr, "TTF_OpenFont: %s\n", TTF_GetError() ); exit( 1 ); }
   
   
   
}


Gra::~Gra( void )
{
}

Gui.h:
C/C++
#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;
};

P-67464
DejaVu
» 2012-10-25 15:30:02
Frazy, które należy wpisać w wyszukiwarkę google:

Tematów jest cała masa, chociażby ten: http://cpp0x.pl/forum/temat/?id=8302
P-67466
« 1 » 2
  Strona 1 z 2 Następna strona