#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--;
}
};
我想通过声明类播放器我不会得到这些错误:
error C2027: use of undefined type 'Player
查看“玩家”的声明
error C2227: left of '->SetHealth' must point to ...
检查错误2027,似乎我必须在Cards类之前明确地拥有整个类,但我认为前向类声明会使它变得不必要。我如何设置它是由Player类创建并分配一个子类并存储在Player类中。继承Cards类的子类将调用Player类的函数。我很难确保两个班级确定彼此的班级。
答案 0 :(得分:3)
在这种情况下,C ++类的前向声明只会告诉编译器您正在使用的类型是一个类。
这通常对标题很有用,因为您只需要知道类型是类。包含类的标题会占用更多的编译时间。
但在实施过程中,情况有所不同。使用转发类,编译器将不知道其成员,方法等。
为此,您需要包含该类的头文件。
例如,只有前向课程,你不能这样做:
owner->GetHealth();
由于编译器无法知道GetHealth
类中存在Player
方法,只有前向类。
请注意,您使用标头实施时可能会在AssignOwner
方法中出现问题。我在C ++上有点生疏,因为我大部分时间都在做C,但我认为你应该尝试在类头中仅声明原型,并在包含正确的实现文件后实现实际方法头文件。
答案 1 :(得分:0)
前向声明允许您声明指向类型的指针或引用,但要实际使用指针或引用,您必须具有完整的类定义。您还需要类类型的成员或局部变量的完整定义。