#pragma once
#include "Player.h"
class Player;
//class SmallHealth;
const int kNumOfCards = 3; //for Player class also
const int kCardLimit = 3;
class Cards
{
private:
protected:
int turnsInEffect;
Player *owner;
public:
Cards()
{turnsInEffect = 1;}
void AssignOwner(Player &player)
{
owner = &player;
}
virtual void PlayCard()
{}
virtual ~Cards(void)
{}
};
class SmallHealth : public Cards
{
public:
void PlayCard()
{
turnsInEffect = 1;
owner->SetHealth(owner->GetHealth() + 5);
//check if health goes over
if(owner->GetHealth() > owner->GetHealthLimit())
{
owner->SetHealth(owner->GetHealthLimit());
}
turnsInEffect--;
}
};
我认为通过声明 Player 类我不会收到这些错误:
error C2027: use of undefined type 'Player
参见“玩家”声明
error C2227: left of '->SetHealth' must point to ...
检查错误 2027,似乎我必须在 Cards 类之前显式地拥有整个类,但我认为前向类声明会使它变得不必要。我的设置方式是创建 Cards 类,并由 Player 类分配一个子类,并将其存储在 Player 类中。继承 Cards 类的子类将调用 Player 类的函数。我很难确保这两个类能够识别彼此的类。
最佳答案
在这种情况下,C++ 类的前向声明只会告诉编译器您正在使用的类型是一个类。
这对于 header 通常很有用,因为您只需要知道该类型是一个类。包含类的 header 会花费更多的编译时间。
但是在实现上却有所不同。对于前向类,编译器将不知道其成员、方法等。
为此,您需要包含该类的头文件。
例如,仅使用前向类,您就不能这样做:
owner->GetHealth();
因为编译器无法知道 GetHealth
方法存在于您的 Player
类中,只有一个前向类。
请注意,当您使用 header 实现AssignOwner
方法时,您的AssignOwner
方法也可能存在问题。我对 C++ 有点生疏,因为我大部分时间都在做 C,但我认为你应该尝试仅在类 header 中声明原型(prototype),并在包含正确的方法后在实现文件中实现实际方法头文件。
关于c++ - 对前向声明感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235324/