2011-05-06 97 views
0

我有三個班級,我嘗試將我的班級連接在一起。我試圖讓玩家1在特定類型的Tile上進行步驟,那麼Player1的重力變量「AccelY」將會改變,從而提供電梯的效果並垂直提升玩家。初始化類創建對象Player1。 (只有一個玩家可以應用於整個課程)這包括CEntity.h和CPlayer.h的頭文件,通過主控制器類CApp.h。 CPlayer類是CEntity的子類。 Accel Y在CEntity中被公開爲一個沒有初始值的浮點數。當玩家使用該類型的拼貼時,我想在CPlayer中更改它。我已經在Tile.h文件中放置了一個if語句子句,但是我無法使用以下代碼訪問和更新該值?我最初嘗試使用默認的類構造函數,但已嘗試使用如下函數。從另一個班級訪問和更改班級成員功能

CTILE.CPP

#include "CTile.h" 
#include "CPlayer.h" 

CTile::CTile(){ 

    TileID = 0; 

    TypeID = TILE_TYPE_NONE; 

    if(TypeID == TILE_TYPE_LIFT){ 

     CPlayer::LiftTile(0.75f, 10.0f); 
     //CPlayer::AccelY = 0.75f; 
     //CPlayer.SpeedY = 2.0; 
    } 
} 

CPLAYER.H

public: 

    CPlayer(); 

    void LiftTile(float x, float y); 

CPLAYER.CPP

void CPlayer::LiftTile(float x, float y){ 

    SpeedY = x; 
    AccelY = y; 
} 

回答

0

您將需要一個類的對象訪問其成員或調用其成員函數,除非成員或成員函數在該類中聲明爲靜態。

CPlayer::LiftTile(0.75f, 10.0f); 

如果CPlayer::LiftTile()被聲明爲

static void CPlayer::LiftTile(float x, float y); in `CPlayer` class 

另一種方式是通過創建CPlayer類的對象調用LiftTitle()只能工作,你會做這樣的事情:

CTile::CTile() 
{ 
    TileID = 0; 

    TypeID = TILE_TYPE_NONE; 

    if(TypeID == TILE_TYPE_LIFT) 
    { 
     CPlayer obj; 
     obj.LiftTile(0.75f, 10.0f); 
     //obj.AccelY = 0.75f; //works if AccelY is declared as public member 
     //obj.SpeedY = 2.0; //works if SpeedY is declared as public member 
    } 
} 
+0

我不能在Entity.h static中創建原始變量聲明,因爲它們是在Entity.cpp中爲跳轉函數操縱的。我已經改變了上面的CTile.cpp,儘管它不喜歡剩下的代碼'code'static void LiftTile(float x,float y); CPlayer.h中的'code'聲明或實現'code'void CPlayer :: LiftTile(float x,float y){ \t \t SpeedY = x; \t AccelY = y; }類中的'代碼' – 2011-05-06 15:57:58

+0

@Mr M:那麼你將不得不在CTile :: CTile()內部創建一個'CPlayer'對象,或者你可以將'Cileyer'對象作爲'CTile'類的成員然後在'CTile()'構造函數中,你可以使用該對象來調用'LiftTile()' – 2011-05-06 16:09:29

+0

我相信問題不在CTile類中,而是在CPlayer類中。 「AccelY」在CEntity.h的默認構造函數中聲明爲公共浮動。 CPlayer是一個CEntity的子類。因此它只識別CPlayer(CPlayer :: CPlayer)的默認構造函數中的AccelY。 LiftTile是僅在CPlayer類中的附加功能。總而言之,問題是我需要在CPlayer的默認構造函數中複製LiftTile的行爲,但只有當它滿足CTile的if子句時並不是所有的時候。 – 2011-05-06 16:42:02

0

如果要訪問AccelY並將類訪問說明符設爲CPlayer::AccelY,則需要將該變量聲明爲小號static

class CPlayer { 
    static float AccelY; 
}; 
0

它的工作原理,如果你使用

Player1.LiftTile(0.75f, 10.0f); 

,作爲調用你的特定玩家的功能。

相關問題