【问题标题】:Accessing and changing a class member function from another class从另一个类访问和更改类成员函数
【发布时间】:2011-05-06 15:27:29
【问题描述】:

我想为我的游戏将三个类链接在一起。我正在努力做到这一点,如果 Player1 踩到特定类型的 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;
}

【问题讨论】:

    标签: c++ class function variables member


    【解决方案1】:

    你需要一个类的对象来访问它的成员或调用它的成员函数,除非成员或成员函数在那个类中被声明为静态的。

    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
        }
    }
    

    【讨论】:

    • 我无法将 Entity.h 中的原始变量声明设为静态,因为它们是在 Entity.cpp 中为跳转功能而操作的。我已经更改了上面的 CTile.cpp,尽管它不喜欢代码的其余部分 codestatic void LiftTile(float x, float y);code CPlayer.h 中的声明或实现 codevoid CPlayer ::LiftTile(float x, float y){ SpeedY = x;加速度 = y; }code 在课堂上
    • @Mr M: 那么你要么必须在CTile::CTile() 内创建一个CPlayer 的对象,要么你可以将Cplayer 对象作为CTile 类的成员,然后在CTile() 内创建一个对象构造函数,您可以使用该对象调用LiftTile()
    • 我相信问题不在于 CTile 类,而在于 CPlayer 类。 “AccelY”在 CEntity.h 的默认构造函数中被声明为公共浮点数。 CPlayer 是 CEntity 的子类。因此它只识别 CPlayer 的默认构造函数(CPlayer::CPlayer)中的 AccelY。 LiftTile 是仅在 CPlayer 类中的附加功能。总之,问题是我需要在 CPlayer 的默认构造函数中复制 LiftTile 的行为,但前提是它满足 CTile 的 if 子句,而不是一直。
    【解决方案2】:

    如果你想使用类访问说明符CPlayer::AccelY 访问AccelY,则需要将变量声明为static

    class CPlayer {
      static float AccelY;
    };
    

    【讨论】:

      【解决方案3】:

      如果你使用它会起作用

      Player1.LiftTile(0.75f, 10.0f);
      

      因为这会为您的特定播放器调用该函数。

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多