2014-02-17 10 views
1

Так что я сделать игру, и у меня есть класс игрока, который имеет перечисление, для которых направление игрок сталкивается в настоящее время, вверх, влево и т.д.перечисления в разных классах несовместимы?

Player.h 
#include "Fireball.h" 
class Player 
{ 
    // Some stuff 
    Fireball fireballs; 
    void update(); 

    private: 
    enum direction {up, left, down, right, upLeft, upRight, downLeft, downRight} playerDir; 
}; 

У меня также есть класс Заклинаний, что я буду получить определенные заклинания, например, Fireball. Класс Spell имеет перечисление, которое совпадает с перечислением в классе Player, так как я хочу иметь возможность передать текущее направление игрока в качестве параметра, когда я обновляю экземпляр заклинания и перемещаю заклинание в этом направление.

Spell.h 
class Spell 
{ 
// Some stuff 

protected: 
    enum direction {up, left, down, right, upLeft, upRight, downLeft, downRight}; 
}; 

.

Fireball.h 
#include "Spell.h" 
class Fireball : public Spell 
{ 
public: 
    void updateFireballs(direction fireballDir); 
}; 

.

Player.cpp 
#include "Player.h" 

void Player::update() 
{ 
    fireballs.updateFireballs(playerDir); 
} 

Когда я пытаюсь передать playerDir в качестве параметра функции updateFireballs, он жалуется, что не может преобразовать «игрока :: направление» к «Назови :: направлении».

Как передать перечисление из другого класса в качестве параметра функции в другом классе?

+1

Почему вы хотите определить отдельные перечисления в обоих классах, особенно если вы хотите использовать их взаимозаменяемо? Было бы разумнее иметь общее определение за пределами обоих классов. –

+0

Даже если вы определяете 'direction' вне класса Player, внутри вы все равно можете сказать' using direction = :: direction; 'сделать' Player :: direction' синонимом глобального 'direction'. Но, возможно, у вас есть что-то вроде «class Map» - направления обычно принадлежат картам. – MSalters

ответ

1

Каждое перечисление является его собственным типом. Когда вы определяете два перечисления в разных классах, вы определяете два типа. У них могут быть одинаковые имена участников, но они не связаны.

Если вам нужно общее перечисление, определите его. Если вы обнаружите, что это перечисление будет иметь столкновение имен, вы должны определить для него «контейнер». Это может быть пространство имен или базовый класс для ваших классов Player и Spell.

0

Не объявляйте класс перечисления дважды в несвязанных классах. Вы можете определить его вне классов. Если вы все еще хотите его под классом Spell, сделайте его общедоступным, чтобы другие классы могли его видеть.

class Spell 
{ 
public: 
    enum Direction {up, left, down, right, upLeft, upRight, downLeft, downRight}; 
}; 

class Fireball : public Spell 
{ 
public: 
    void updateFireballs(Spell::Direction fireballDir); 
}; 

class Player 
{ 
    Fireball fireballs; 
    void update() 
    { 
     fireballs.updateFireballs(playerDir); 
    } 
private: 
    Spell::Direction playerDir; 
}; 
Смежные вопросы