Доступ и изменение функции-члена класса из другого класса - PullRequest
0 голосов
/ 06 мая 2011

У меня есть три класса, которые я пытаюсь связать вместе для своей игры.Я пытаюсь сделать так, чтобы, если Player1 наступит на определенный тип плитки, переменная гравитации Player1 "AccelY" изменится, обеспечивая эффект лифта и подъем игрока вверх по вертикали.Класс инициализации создает объект Player1.(Существует только один проигрыватель, поэтому его можно применить ко всему классу). Это включает заголовочные файлы для CEntity.h и CPlayer.h через CApp.h основной класс контроллера.Класс CPlayer является дочерним классом CEntity.Accel Y публично объявлен в CEntity как поплавок без начального значения.Я хочу изменить его в CPlayer, когда игрок находится на плитке такого типа.Я поместил оператор if в файл Tile.h, но не могу получить доступ и обновить значение, используя следующий код?Сначала я попытался с помощью конструктора класса по умолчанию, но попробовал с функцией, как показано ниже.

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

Ответы [ 3 ]

0 голосов
/ 06 мая 2011

Если вы хотите получить доступ к AccelY с указателем доступа к классу как, CPlayer::AccelY, тогда переменная должна быть объявлена ​​как static:

class CPlayer {
  static float AccelY;
};
0 голосов
/ 06 мая 2011

Работает, если вы используете

Player1.LiftTile(0.75f, 10.0f);

Как это вызывает функцию для вашего конкретного игрока.

0 голосов
/ 06 мая 2011

Вам понадобится объект класса для доступа к его членам или вызова его функций-членов, если только члены или функции-члены не объявлены статическими в этом классе.

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

может работать, только если CPlayer::LiftTile() объявлено как

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

Другой способ - вызвать LiftTitle(), создав объект класса CPlayer, вам придетсясделать что-то вроде этого:

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