Page 1 of 1

problēma ar #include

Posted: 04 Mar 2012, 16:52
by kristapuciitis
Sveiki!
Man ir kaut kāda kļūda. Man ir fails player.h

Code: Select all

#ifndef _PLAYER_H_
#define _PLAYER_H_

#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>

#define PLAYER_WIDTH 30
#define PLAYER_HEIGHT 70

enum Direction
{
	left = -1,
	right = 1
};

class Player
{
public:
	sf::Vector2<float> Position;
	void Initialize(sf::Vector2f position);
	void Update(sf::Time time);
	void Draw(sf::RenderWindow* window);
private:
	float acceleration, maxSpeed;
	sf::Vector2f velocity;
	Direction direction;
};

#endif
un level.h

Code: Select all

#ifndef _LEVEL_H_
#define _LEVEL_H_

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

#include "cell.h"
#include "player.h"

#define LEVEL_WIDTH_MAX 80
#define LEVEL_HEIGHT_MAX 30

#define CELL_WIDTH 40
#define CELL_HEIGHT 40

class Level
{
public:
	Level(sf::RenderWindow* window);
	void LoadFromFile(const char* fileName, Player* player);
	void Draw();

	Cell Cells[LEVEL_WIDTH_MAX][LEVEL_HEIGHT_MAX];
	unsigned width, height;

private:
	sf::RenderWindow* _window;
};

#endif
Kā redzams, funkcijas Level::LoadFromFile() pieprasa pointeri uz Player, bet Player klasē nav funkciju, kas pieprasa pointeri uz Level. Tiklīdz player.h failā ierakstu #include "level.h" nerāda, ka ir error, bet, kad kompilēju, tad parādās error C2061: syntax error : identifier 'Player' . Kur ir problēma? Error apraksts nav saprotams.

Re: problēma ar #include

Posted: 04 Mar 2012, 17:21
by snake5
Kāds error ir tad, kad kompilē kodu tādu, kāds tas ir?
error C2061: syntax error : identifier 'Player'
..nozīmē to, ka Player nav definēts. Radās tieši no tā, ka iekļāvi pirmo failu otrajā UN otro pirmajā. Kad kompilēts tiek player.cpp, player.h ievelk iekšā level.h (kurš prasa Player klasi) pirms definē Player klasi.

Re: problēma ar #include

Posted: 04 Mar 2012, 17:28
by kristapuciitis
Nu labi, kā man panākt, lai tāds errors nebūtu?

Re: problēma ar #include

Posted: 04 Mar 2012, 17:39
by atis
Ja tev ir divas klases/struktūras, kas satur pointerus viena uz otru, tad tā vietā lai iekļautu visu pilno definīciju ar #include, vari ielikt forward deklarāciju šādā veidā:

Code: Select all

class Player;
vai

Code: Select all

class Level;

Re: problēma ar #include

Posted: 04 Mar 2012, 17:45
by kristapuciitis
Tagad viss iet, bet, kad rakstu level->... Player::Update funkcijā, tad parāda "Pointer to incomplete class type is not allowed". Kur ir problēma?

Re: problēma ar #include

Posted: 04 Mar 2012, 18:40
by atis
Tev funkcija jādefinē .cpp failā (piemēram, player.cpp), un tajā failā vari droši #inclūdot level.h failu.

Iemesls, kāpēc tu vari neiekļaut .h failu iepriekšējā gadījumā bija tas, ka tev bija jānodefinē tikai pointeris, un visi pointeri ir vienādi pēc būtības. Savukārt līdzko tev jāķēpājas pa struktūras iekšpusi, tad kompilatoram ir jāzina, kas viņai vēderā (jāredz pilnā Level klases definīcija).

Re: problēma ar #include

Posted: 04 Mar 2012, 19:10
by kristapuciitis
Sapratu, paldies, tagad viss iet. =)