2013-04-30 40 views
0

好的,所以我有一些问题。 1.我需要能够注册孩子类,当它创建与游戏广播。 2.我需要能够从一个GameObject指针数组中调用子类的方法。 3.我需要它是实际的课程,而不仅仅是它们的复制。 在文件systemvars.h中我有我的全局方法和一些变量。用经理注册一个班级,然后调用子类覆盖的方法

#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:为gameobjects

#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 gameclass定义

#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) 
{ 
} 

游戏物体的支架.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 

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

Player.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(); 
} 

Player.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); 
} 

的main.cpp

#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 

但insted的我得到:

Sent message 
    Sent message from game 
    Recived message in Gameobject 

Im相当肯定我有一个sliceing问题了,但是我不知道该怎么办才好,或者它在哪里。 那么,任何想法男性?

此外,我试图削减类有点,所以即时通讯不发布2000年代码行。所以如果有人失踪让我知道。 大约有十几个类继承自gameobject。我需要他们全部以这种或那种方式与海誓山盟交谈。

回答

0

只是让CLASSTYPE_PLAYER等让我担心你试图颠覆/重塑C++ OOP。你已经有了语言中的'class'这个概念,为什么要重新发明它?如果我错了,请原谅我。除此之外,我建议你查看发布者 - 订阅者框架来完成你之后的事情,或者实现你自己的事情。我相信有人会更直接地回答你的C++问题。

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

+0

我只是想设置一个广播。基本上在程序中的任何地方我都想要一种发送消息的方式。如sendmesage(“+ 5gold1”,CLASSTYPE_Player);所以在游戏中注册的每个玩家都会得到这个消息。然后让他们决定是否要对此做任何事情。 – 2013-04-30 04:09:50

+0

听起来像pub-sub给我..我在几年前的一个Java项目中使用它,但没有在C++中,请尝试查看它并祝你好运。 – codah 2013-04-30 07:14:52

+0

似乎相似,但我不知道如何应用这个=/ – 2013-04-30 07:49:43