2013-04-30 2 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: держатель для геймобжекты

#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. У вас уже есть понятие «класс» на языке, зачем его изобретать? Простите меня, если я ошибаюсь. Помимо этого, я предлагаю вам найти структуры подписчиков издателя, чтобы выполнить то, что вам нужно, или реализовать свои собственные. Я уверен, что кто-то ответит на вашу проблему на C++ более подробно.

Редактировать: тон первого комментария.

+0

Я просто пытаюсь настроить трансляцию. В принципе в любом месте программы я хочу, чтобы отправить сообщение. Например, sendmesage («+ 5gold1», CLASSTYPE_Player); Поэтому каждый игрок, зарегистрированный в игре, получает сообщение. а затем разрешить им решить, хотят ли они что-либо сделать. –

+0

Звучит как pub-sub для меня ..Я использовал его в Java-проекте пару лет назад, но не на C++, попробуйте найти его и удачи. – codah

+0

кажется похожим, но у меня нет подсказки, как применить this =/ –