C ++中的类定义顺序

时间:2011-06-16 06:37:22

标签: c++ class pointers reference definition

我在这里遇到了一些问题。我正在尝试定义几个类,其中一些是玩家,一些是属于玩家的Pawns。来自Python,我习惯于通过Pawn方便地访问Pawn拥有的玩家,以及通过玩家访问玩家的Pawns。如果我错了,请纠正我,但在C ++中这似乎是不可能的。

我目前首先定义播放器,其中一个数据成员m_Pawns应该是vector<Pawn>。我声明了数据成员,但我没有给它任何值。我还定义了一个成员函数,用于将一个pawn的向量分配给m_Pawns,但我不会在构造函数附近的任何地方调用它。由于我实际上并没有在Pawn的构造函数中调用Player的构造函数,所以看起来我应该没问题。

这是我的Player课程。 Board类是事先定义的,而Pawn类是在之后定义的(Pawn类包含指向Player类所有者的指针,因此切换它不会'真的有帮助。)

class Player
{
public:
    Player(sf::Color color, const string& name);
    sf::Color GetColor();
    string GetName();
    void CreatePawns(Board& board, int which);
protected:
    vector<Pawn> m_Pawns;
    sf::Color m_Color;
    string m_Name;
};

Player::Player(sf::Color color, const string& name):
    m_Color(color),
    m_Name(name)
{}

sf::Color Player::GetColor()
{
    return m_Color;
}

string Player::GetName()
{
    return m_Name;
}

void Player::CreatePawns(Board& board, int which)
{
    switch(which)
    {
    case 1:
        for(int i = 0; i < 4; ++i)
        {
            m_Pawns.push_back(Pawn((*board).Cluster1[i], this*, m_Color));
        }
        break;
    case 2:
        for(int i = 0; i < 4; ++i)
        {
            m_Pawns.push_back(Pawn((*board).Cluster2[i], this*, m_Color));
        }
        break;
    case 3:
        for(int i = 0; i < 4; ++i)
        {
            m_Pawns.push_back(Pawn((*board).Cluster3[i], this*, m_Color));
        }
        break;
    default:
        cout << "Invalid player ID!\n\n";
        break;
    }
}

4 个答案:

答案 0 :(得分:2)

如果class Player首先出现,class Pawn稍后出现,那么您可以仅声明指针或引用后一个类(此处为Pawn)。 不能包含后期类的对象,例如

class Player {
  Pawn* p; // allowed
  Pawn& r; // allowed
  vector<Pawn*> p; // allowed
  vector<Pawn&> vr; // not allowed (reference are not copyable)
  vector<Pawn> o; // error !
};

class Pawn {};

你无法克服这种情况,因为在{+ 1}}的C ++中,一个人需要显示声明对象的完整定义。

唯一的出路是重新格式化代码或使用指针/引用(使用前向声明)。

答案 1 :(得分:0)

类Pawn仍然需要定义,因此编译后可以实例化vector。您可以在向量中存储Pawn对象的引用或指针,而不是值;矢量例如。在这种情况下,类Pawn的前向声明就足够了。

答案 2 :(得分:0)

您可以这样做:

class Pawn;

class Player {
}

class Pawn {
}

答案 3 :(得分:0)

可以切换它,因为你可以转发声明Player,然后Pawn 可以指向它。

可以获取指向不完整类型的指针。您无法保留该类型的值。