0

好的,所以我有一些问题。1.我需要能够在使用游戏创建时注册子类以进行广播。2. 我需要能够从 GameObject 指针数组中调用子类的方法。3. 我需要它是实际的课程,而不仅仅是它们的副本。在文件 systemvars.hi 中有我的全局方法和一些变量。

#pragma once
    //=================================
    // include guard
    #ifndef _SYSTEMVARS_H_
    #define _SYSTEMVARS_H_
//=================================
// forward declared dependencies
class Game;
//=================================
// included dependencies
#include <iostream>
using namespace std;
//global enums
const enum CLASSTYPE{CLASSTYPE_NULL,CLASSTYPE_PLAYER,CLASSTYPE_DUNGION,CLASSTYPE_ENTITY,CLASSTYPE_MAP,CLASSTYPE_MENU};
//Global methods
void setGameRefrence(Game*);
Game* getGameRefrence();

systemvars.cpp:定义

#include "SystemVars.h"
    static Game* curentgame;
    void setGameRefrence(Game* mygame)
    {
        curentgame = mygame;
    }
Game* getGameRefrence()
{
    return curentgame;
}

在我的 Game.h 中:游戏对象的持有者

#pragma once
    //=================================
    // include guard
    #ifndef _GAME_H_
    #define _GAME_H_

//=================================
// forward declared dependencies
class GameObject;
//class Player;
//=================================
// included dependencies
#include "SystemVars.h"
#include "GameObject.h"
//#include "Player.h"
#include <iostream>
using namespace std;
//=================================
// the actual class
class Game
{
public:
    Game(void);
    void registerGameObject(GameObject*);
    void unregisterGameObject(GameObject*);
    void sendMessageToAllObjects(string message,CLASSTYPE recipeint);
    ~Game(void);
private:
    GameObject *gameobjects2[1000];
    int numberofobject;
};
#endif

game.cpp 游戏类定义

#include "Game.h"
    //#include "Player.h"

Game::Game(void)
{
    setGameRefrence(this);
    //logHelperMessage(INFO,1,"Registerd game");
    numberofobject = 0;
}

void Game::registerGameObject(GameObject* newobj)
{
    //logHelperMessage(INFO,1,"Registerd");
    newobj->setId(numberofobject);
    gameobjects2[numberofobject] = newobj;
    numberofobject++;
    //gameobjects.push_back(newobj);
}
void Game::unregisterGameObject(GameObject* objtodie)
{
    //logHelperMessage(INFO,1,"Unregister");

    for(int i = objtodie->getId();i < numberofobject - 1;i++)
    {
        gameobjects2[i] = gameobjects2[i+1];
        gameobjects2[i]->setId(i);
    }
    gameobjects2[numberofobject-1] = nullptr;
    numberofobject--;
}
void Game::sendMessageToAllObjects(string message,CLASSTYPE recipeint)
{
    for(int i = 0; i < numberofobject;i++)
    {
        cout << "Sent the message from game");
        //((Player *)gameobjects2[i])->sendMessage(message);
        //static_cast<Player*>(gameobjects2[i])->sendMessage(message);
    }
} 
Game::~Game(void)
{
}

Gameobject.h:我的内部游戏类的父级。

#pragma once
    //=================================
    // include guard
    #ifndef _GAMEOBJECT_H_
    #define _GAMEOBJECT_H_

//=================================
// forward declared dependencies
enum CLASSTYPE;
//=================================
// included dependencies
#include <iostream>
#include "SystemVars.h"
using namespace std;

//=================================
// the actual class

class GameObject
{
public:
    GameObject();
    GameObject(CLASSTYPE mytype);
    ~GameObject(void);
    virtual void sendMessage(string data);
    virtual CLASSTYPE getMyClassType();
    virtual void setMyClassType(CLASSTYPE newrecip);
    void setId(int val);
    int getId();
protected:
    CLASSTYPE _MYCURRENTCLASSTYPE;
    int myid;
};
#endif

游戏对象.cpp

#include "GameObject.h"

GameObject::GameObject() : _MYCURRENTCLASSTYPE(CLASSTYPE_NULL)
{
    //do not register
}

GameObject::GameObject(CLASSTYPE mytype): _MYCURRENTCLASSTYPE(mytype)
{
    //register this object into the gameobject list.
    getGameRefrence()->registerGameObject(this);
}


GameObject::~GameObject(void)
{
    getGameRefrence()->unregisterGameObject(this);
}

void GameObject::sendMessage(string data)
{
    //logHelperMessage(INFO,1,"Recived te message in GameObject");
    cout << "Recived te message in GameObject";
}

CLASSTYPE GameObject::getMyClassType()
{
    return _MYCURRENTCLASSTYPE;
}

void GameObject::setMyClassType(CLASSTYPE newrecip)
{

}
void GameObject::setId(int val)
{
    myid = val;
}
int GameObject::getId()
{
    return myid;
}

播放器.h:

pragma once
    //=================================
    // include guard
    #ifndef _PLAYER_H_
    #define _PLAYER_H_
//=================================
// forward declared dependencies
//=================================
// included dependencies

#include "SystemVars.h"
#include "GameObject.h"
//=================================
// the actual class
class Player : public GameObject
{
public:
    Player();
    void sendMessage(string data) override;
    void test();
}

播放器.cpp:

Player::Player() : GameObject(CLASSTYPE_PLAYER)
    {

    }
void Player::sendMessage(string data)
{
    //logHelperMessage(INFO,1,"Recived the message in Player");
    cout << "Recived the message in Player";
    //logHelperMessage(INFO,1,data.c_str());
    cout << data;
}
void Player::test()
{
cout << "Sent message";
    getGameRefrence()->sendMessageToAllObjects("Test",CLASSTYPE_PLAYER);
}

主文件

#pragma once
#include "SystemVars.cpp"
#include "Player.h"
#include "Game.h"
Game mygame;
int main(int argc, char **argv)
{
    setGameRefrence(&mygame);
    Player newplayer = Player();
    newplayer.test();
}

现在这一切都已经过去了。预期的输出是:

Sent message
    Sent message from game
    Recived message in Player

但我得到:

Sent message
    Sent message from game
    Recived message in Gameobject

我很确定我有一个切片问题,但我不知道该怎么做,或者它在哪里。那么,有什么想法吗?

另外,我试图减少课程,所以我没有发布 2000~ 行代码。因此,如果有任何遗漏,请告诉我。大约有十几个类继承自游戏对象。我需要他们都以一种或另一种方式互相交谈。

4

1 回答 1

0

仅仅通过拥有 CLASSTYPE_PLAYER 等,我就会担心你正试图颠覆/重新发明 C++ OOP。你已经有了语言中“类”的概念,为什么要重新发明它?如果我错了,请原谅我。除此之外,我建议您查找发布者-订阅者框架来做您所追求的事情,或者实现您自己的。我相信有人会更直接地回答你的 C++ 问题。

编辑:第一条评论的语气。

于 2013-04-30T03:42:44.280 回答