2015-02-23 47 views
1

好吧...我已經理解了關於循環依賴和前向聲明的這個問題,但是我無法理解涉及繼承和基於指針變量的特定錯誤。子類中使用的不完整指針 - 錯誤:使用未定義類型

我會顯示相關的代碼片段:

Player是實體派生類

Entity.hpp

class Entity : public sf::Sprite{ 

private: 

    int health; 
    float speed; 
    sf::Time spawntime; 
    bool invincible; 


protected: 

    SceneGame *myScene; // let's keep it at null 
         // since setScene will take care of it 

    public: 

// more code.... 

void setScene(SceneGame *scene){myScene = scene;}; 
    SceneGame* getScene(){return myScene;}; 

}; 

player.cpp //假設player.h完成

myScene可以從派生形式的任何類訪問實體

void Player::shootPlayer(float dt){ 

    // we reduce time for shoot delay 

    shootDelay -= dt; 

    if (shootDelay < 0.0f) return; 

    resetDelay(); 

    if (Input::instance()->pressKeybutton(sf::Keyboard::Space)){ 



     // I know I set SceneGame* myScene as protected back in Entity class. 
     // However, because it is claimed to be undefined, 
     // despite being forward-declared back in entity, 
     // I'm getting the 'use of undefined type class' error C2027 

     sf::Texture bulletTex; 
     bulletTex = (myScene->game->texmgr.getRef("bulletPlayer")); 


     Bullet* bullet_p = new Bullet(bulletTex, 
      1, 10, false, false, 0.0f); 

     bullet_p->setPosition(this->getGlobalBounds().width, 
           this->getGlobalBounds().height/2); 

    } 
} 

鏈接,回答問題: Forward declaration & circular dependency

回答

1

您有SceneGame的前向聲明,可能是entity.hpp的形式爲class SceneGame;。這足以將其用作指針。

player.cpp,你實際上使用這個類,你需要知道它的細節(你不需要在標題中)。可能的是,你的player.cpp應包括在結尾處增加一個#include "SceneGame.hpp"SceneGame.hpp(或任何你SceneGame類實際上定義)

修復在你的player.cpp文件中包含。

+0

謝謝......我意識到我不需要在播放器文件中進行前向聲明。我只需要包含。 前向聲明僅當我必須表示某個特定類的變量時纔有用。 – JBRPG 2015-02-24 00:17:35

0

雖然你已經向前聲明的SceneGame類,你包括完整的定義,你開始使用這個類的任何方法之前,否則,編譯器如何知道SceneGame類支持哪些方法?

我想你需要#include "SceneGame.h"或類似的在你的Player.cpp文件。

相關問題