Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    residenza
    matrix
    Messaggi
    56

    [C++] Passaggio puntatore a oggetto nel costruttore

    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

    codice:
    #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 ';'


    codice:
    #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:

    codice:
    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:

    codice:
    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:

    codice:
    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
    Ultima modifica di astolfo96; 12-05-2018 a 11:56

  2. #2
    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.

    codice:
    #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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    residenza
    matrix
    Messaggi
    56
    grazie mille per la risposta, avevo provato la forward declaration ma dimenticando di mettere l'inclusione dentro il .cpp

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.