对远期申报感到困惑
confused on forward declarations
#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
参见'Player'的声明
error C2227: left of '->SetHealth' must point to ...
检查错误2027,似乎我必须在Cards类之前显式地拥有整个类,但我认为前向类声明将使其不必要。我如何设置它是由Player类创建和分配Cards类的子类并存储在Player类中。继承Cards类的子类将调用Player类的函数。我有一个艰难的时间来确保两个类识别彼此的类
在这种情况下,c++类的前向声明只会告诉编译器你使用的类型是一个类。
这通常对头文件很有用,因为您只需要知道该类型是一个类。包含类的头文件会占用更多的编译时间。
但是在实现中,它是不同的。对于前向类,编译器将不知道它的成员、方法等。
为此,您需要包含类的头文件。
例如,只有forward类,你不能这样做:
owner->GetHealth();
由于编译器无法知道GetHealth
方法存在于您的Player
类中,只有一个转发类。
注意你也可能有一个问题在你的AssignOwner
方法,因为你实现它使用你的头。我对c++有点生透了,因为我大部分时间都在做C,但我认为你应该尝试在类头文件中声明原型,并在包含正确的头文件后,在实现文件中实现实际的方法。
前向声明允许声明指向类型的指针或引用,但要实际使用指针或引用,必须具有完整的类定义。您还需要类类型的成员或局部变量的完整定义。
相关文章:
- 没有找到相关文章