从继承的类C ++进行转换

时间:2018-06-19 23:35:33

标签: c++ casting

我有三个基本类 {Player,Weapon,Game} 和一个从Player继承的类战士。

我想使用功能 addPlayer 对功能 addWizard 进行编码。我想到了动态转换,但不确定如何开始。任何帮助将不胜感激。

注释

* playersArray中的每个索引均包含指向类Player的指针。

*如果给定索引i中的玩家名称,playersArray [i]等于空字符串,     表示还没有玩家。

*我添加了每个Class Game和Player(仅默认设置)和Wizard的构造器。

void addWizard(string const& playerName,string const& weaponName,
                       Target target, int hitstrength,int range);

GameStatus Game::addPlayer(const string playerName, const string weaponName,
                               Target target,int hit_strength)
    {   int count=0,place=0;
        if(this->countPlayers()>=maxPlayer)
        {
            throw GameFull();
        }
        for(int i=0;i<maxPlayer;i++)
        {
            if(playersArray[i]->getPlayerName()!="" &&
               playersArray[i]->isPlayer(playerName))
            {
                throw NameAlreadyExists();
            }
            if(playersArray[i]->getPlayerName()==""&& count==0)
            {
                count++;
                place=i;
            }
        }
        Weapon newWeapon(weaponName,target,hit_strength);
        Player newPlayer(playerName,newWeapon);
        *playersArray[place]=newPlayer;
        return SUCCESS;
    }

课程:

class Game {
        int maxPlayers;
        Player **playersArray;
}

class Player {
        string player_name;
        int level;
        int strength;
        Weapon player_weapon; }

//the inherited Class 

class Wizard : public Player {
    int range;
public:
    Wizard();
    Wizard (string const& name, Weapon const& weapon, int range);
}

构造:

Game::Game(int maxPlayer)
: maxPlayer(maxPlayer),playersArray(new Player*[maxPlayer])
{
    for(int i=0;i<maxPlayer;i++)
    {
        playersArray[i]=new Player;
    }
}

Player::Player():
        level(0),life(0),strength(0),place(0),player_name()
{
}

Wizard::Wizard(string const& name, Weapon const& weapon, int range) :
        Player(name,weapon),range(range){
    if (weapon.getTarget() == LIFE){
        throw IllegalWeapon();
    }
    if(range<0)
        throw InvalidParam();
}

2 个答案:

答案 0 :(得分:1)

由于这两种方法之间存在共同的实现-您需要考虑将此实现与“ addPlayer”方法分开。

创建函数:

int FindEmptyPlace(const string& playerName) {
    // logic to find the empty place
    // BTW, you can brake the for loop after you find the place
}

更改AddPlayer方法以获取Player *:

GameStatus Game::addPlayer(Player* player, int place);

然后用不同的参数实现两个方法:

GameStatus Game::addRegPlayer(const string playerName, const string weaponName,
                           Target target,int hit_strength);
GameStatus Game::addWizard(string const& playerName,string const& weaponName,
                   Target target, int hitstrength,int range);

在这两种方法上-找到空白处并调用新的“ addPlayer”方法来创建武器并将播放器插入合适的位置(您可能会考虑在每个函数中创建武器并将其作为参数发送给“ addPlayer” “)。

答案 1 :(得分:-2)

我不会写一堆代码,因为我必须很快去做。

但是我看到的是您的addPlayer函数应该接受Player引用或指针,或者更好的是std::unique_ptr而不是构造Player本身。

然后,将继承自Player的任何内容传递到addPlayer并将其添加到游戏世界中,将是一件简单的事情。