PDA

Visualizza la versione completa : [C++] Passaggio puntatore a oggetto nel costruttore


astolfo96
12-05-2018, 12:53
Salve a tutti sto passando da java a c++ e non capisco il problema che mi da il programma quando passo il puntatore dell'oggetto della classe player al costruttore della classe Animazione:

error C2143: syntax error: missing ';' before '*'
missing type specifier - int assumed. Note: C++ does not support default-int

questi errori si presentano sulla linea dove dichiaro il puntatore ad Animation



#pragma once

#include "Entity.h"
#include "MapManager.h"
#include "Animation.h"

class Player : public Entity
{
public:
Player(std::string name, float x, float y, float w, float h, int life, MapManager mm);
~Player();
sf::Thread thread;
bool vivo;
void run();
bool collides(Entity*);
void setDeltaTime(double);

MapManager _mm;
Tile* getUnderPlayerTile(Tile*);
Animation* anim; //<---
double deltaTime;
double totalTime = 0.0;
bool go = true;
};



questo errore me lo da sul prototipo del costruttore:

error C2061: syntax error: identifier 'Player'

questi 3 errori me li da sulla dichiarazione del puntatore alla classe Player

error C2143: syntax error: missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'




#pragma once

#include <SFML/Graphics.hpp>

#include "Player.h"

class Animation
{
public:
//nx frame asse x
//ny frame asse y
Animation(Player* player, int w, int h, int nx, int ny); //<---
~Animation();
void nextFrame();


private:
int _w, _h, _nx, _ny;
int actualX, actualY;
Player* _player; //<---
};


questo � il costruttore nel file Animation.cpp:



Animation::Animation(Player* player, int w, int h, int nx, int ny) : _player(player), _w(w), _h(h), _nx(nx), _ny(ny)
{
actualX = 0;
actualY = 0;
_w /= nx;
}


questo � il costruttore della classe player, dove passo un puntatore di Player al puntatore di Animazione:



Player::Player(std::string name,
float x, float y, float w, float h,
int life, MapManager mm)
: _mm(mm), Entity(name, x, y, w, h, life), thread(&Player::run, this)
{
_mm = mm;
std::cout << "Player created\n";
vivo = true;
anim = new Animation(this, w, h, 10, 1);
thread.launch();
}


qualcuno sa spiegarmi come risolvere, sto provando a fare qualcosa con le librerie SFML ma non capisco perch� non vada, prima avevo passato direttamente lo sprite al costruttore di Animazione e funzionava ma poi avrei dovuto aggioranrlo e usare il return non essendo un puntatore quindi e per fare prima lo ricavo dal puntatore di player e tramite refernza lo modifico:



void Animation::nextFrame() {
//actualX � la posizione da dove leggere la texture
actualX = (actualX + _w) % (_nx*_w);

//ricavo un puntatore allo sprite dell'oggetto di player
sf::Sprite* sprite = _player->getSpritePointer();

//cambio frame dello spritesheet
sprite->setTextureRect(sf::IntRect(actualX, 0, _w, _h));
}


grazie in anticipo

MItaly
13-05-2018, 13:18
Player.h include Animation.h che vorrebbe includere Player.h, che per non viene incluso per via del #pragma once (se non ci fosse andrebbe in ricorsione infinita e si fermerebbe solo per sforamento dei limiti di stack di inclusione). Per questo motivo, quando, nell'include di Player.h viene definita la classe Animation, il compilatore non sa nulla della classe Player, da cui gli errori sul costruttore.

In questo caso, dato che in Animation ti serve solo un puntatore a Player, te la puoi cavare con una forward declaration.



#pragma once

#include <SFML/Graphics.hpp>

class Player;

class Animation
{
public:
//nx frame asse x
//ny frame asse y
Animation(Player* player, int w, int h, int nx, int ny);
// eccetera

(in Animation.cpp invece includerai Player.h, dato che l'implementazione dei metodi di Animation mi aspetto che debba operare effettivamente sui metodi di Player, per cui deve conoscere la sua definizione completa).

astolfo96
13-05-2018, 15:56
grazie mille per la risposta, avevo provato la forward declaration ma dimenticando di mettere l'inclusione dentro il .cpp

Loading