Gar*_*ckW 5 c++ pointers reference class definition
我在这里遇到了一些问题.我正在尝试定义几个类,其中一些是玩家,一些是属于玩家的Pawns.来自Python,我习惯于通过Pawn方便地访问Pawn拥有的玩家,以及通过玩家访问玩家的Pawns.如果我错了,请纠正我,但在C++中这似乎是不可能的.
我目前首先定义Player,其中一个数据成员m_Pawns应该是a 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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果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 {};
Run Code Online (Sandbox Code Playgroud)
没有办法克服这种情况,因为在 C++ 中,non-template类需要显示完整的定义来声明对象。
唯一的出路是重新格式化代码或使用指针/引用(带有前向声明)。