• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ klasa bazowa

VPS Starter Arubacloud
0 głosów
503 wizyt
pytanie zadane 22 lutego 2017 w C i C++ przez sofnir Gaduła (4,690 p.)
edycja 22 lutego 2017 przez Patrycjerz

Hej mam problem, wyskakuje mi błąd i nie wiem co jest tego przyczyną.

#pragma once

#include <stack>
#include <SFML/Graphics.hpp>
#include "GameState.h"

class Game
{
public:

	Game();
	~Game();

	std::stack<GameState*> states;
	sf::RenderWindow window;

	void pushState(GameState* state);
	void popState();
	void changeState(GameState* state);
	GameState* peekState();

	void gameLoop();	
};
#pragma once

#include "Game.h"

class GameState
{
public:

	Game *game;

	virtual void draw(const float dt) = 0;
	virtual void update(const float dt) = 0;
	virtual void handleInput() = 0;
};

Błąd wyskakuje w miejscu, gdy dodaję do klasy GameState wskaznik na klasę game.

Game *game;

Błędy:

- syntax error missing ';' before '*'

- missing type specifier - int assumed. note c++ does not support default-int

- unexpected token(s) preceding ';'

Proszę o pomoc :)

 

komentarz 22 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)
Pokaż pliki źródłowe cpp, do których dołączasz nagłówki. Wygląda to na wielokrotną deklaracje jednej klasy lub tworzenie obiektu typu zdefiniowanego później.
komentarz 22 lutego 2017 przez sofnir Gaduła (4,690 p.)
edycja 22 lutego 2017 przez Patrycjerz
#include "Game.h"

Game::Game()
{
}

Game::~Game()
{
}

void Game::pushState(GameState * state)
{
}

void Game::popState()
{
}

void Game::changeState(GameState * state)
{
}

GameState * Game::peekState()
{
	return nullptr;
}

void Game::gameLoop()
{
}

GameState nie ma pliku cpp bo jest to klasa bazowa.

komentarz 22 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)

Pokaż bardziej plik z funkcją main. Chciałbym przeanalizować poszczególne dołączenia nagłówków.

PS: Bloczki na kody źródłowe mają możliwość zmiany języka na C++.

2 odpowiedzi

0 głosów
odpowiedź 22 lutego 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 23 lutego 2017 przez sofnir
 
Najlepsza

Miałem dokładnie taki sam problem.
Nazywa się to circural dependency.
W Game.h includujesz GameState.h oraz w GameState.h includujesz Game.h
W pliku w którym wykrywa ci błąd, możesz dodać przed klasą GameState, deklaracje klasy Game

 

class Game;

class GameState {...}

 

komentarz 23 lutego 2017 przez sofnir Gaduła (4,690 p.)
Tak, teraz działa, a można gdzieś o tym poczytać, bo nie spotkałem się z taką sytuacją w żadnym kursie, ani książce? Chciałbym wiedzieć dokładnie dlaczego tak się dzieje.
komentarz 23 lutego 2017 przez Knayder Nałogowiec (37,640 p.)
Sam nie czytałem o tym nigdzie, ale zapewne znajdziesz dużo informacji pod hasłem
"circural dependency"
0 głosów
odpowiedź 22 lutego 2017 przez criss Mędrzec (172,590 p.)

Pliki nawzajem się includują i tworzą pętle, a kompilator się przed tym broni. W efekcie dostajemy różne dziwne błędy z kosmosu.

W pliku z klasą GameState tylko zadeklaruj istnienie klasy Game. Jeśli chciałbyś gdzieś w ewentualnych definicjach metod GameState (tutaj widze, że ich raczej nie będzie) używać klasy Game (a nie jedynie zadeklarować wskaźnik), to definicje metod umieć w pliku .cpp i tam też zaincluduj plik z definicją Game (Game.h prawodopodobnie).

Dla 100% jasności:

#pragma once
 
class Game;
 
class GameState
{
public:
 
    Game *game;
 
    virtual void draw(const float dt) = 0;
    virtual void update(const float dt) = 0;
    virtual void handleInput() = 0;
};

Nie potrzebujesz definicji całego typu, żeby zadeklarować wskaźnik na ten typ.

Podobne pytania

0 głosów
3 odpowiedzi 475 wizyt
pytanie zadane 31 października 2017 w C i C++ przez Ditrix Mądrala (5,650 p.)
0 głosów
2 odpowiedzi 261 wizyt
pytanie zadane 8 listopada 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
1 odpowiedź 1,688 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez Asokus Początkujący (450 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...