对远期申报感到困惑

confused on forward declarations

本文关键字:      更新时间:2023-10-16
#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,但我认为你应该尝试在类头文件中声明原型,并在包含正确的头文件后,在实现文件中实现实际的方法。

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

相关文章:
  • 没有找到相关文章