对前瞻性声明感到困惑

时间:2011-11-22 23:21:14

标签: c++ forward-declaration

#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类的函数。我很难确保两个班级确定彼此的班级。

2 个答案:

答案 0 :(得分:3)

在这种情况下,C ++类的前向声明只会告诉编译器您正在使用的类型是一个类。

这通常对标题很有用,因为您只需要知道类型是类。包含类的标题会占用更多的编译时间。

但在实施过程中,情况有所不同。使用转发类,编译器将不知道其成员,方法等。

为此,您需要包含该类的头文件。

例如,只有前向课程,你不能这样做:

owner->GetHealth();

由于编译器无法知道GetHealth类中存在Player方法,只有前向类。

请注意,您使用标头实施时可能会在AssignOwner方法中出现问题。我在C ++上有点生疏,因为我大部分时间都在做C,但我认为你应该尝试在类头中仅声明原型,并在包含正确的实现文件后实现实际方法头文件。

答案 1 :(得分:0)

前向声明允许您声明指向类型的指针或引用,但要实际使用指针或引用,您必须具有完整的类定义。您还需要类类型的成员或局部变量的完整定义。