c++ - 对前向声明感到困惑

标签 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--;
    }
};

我认为通过声明 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/

相关文章:

c++ - 带有自定义删除器的 std::shared_ptr 的 Typedef 别名

c++ - 传递大括号初始化器列表参数时调用可变参数函数模板的问题

c++ - 如何组织包含模板和 friend 混合的类?

c++ - 不完整的类型,前向声明

c++ - C++ 前向声明的巨大困惑

c++ - 模板:使用前向声明来减少编译时间?

c++ - 为什么类的析构函数被调用了两次?共享指针

c++ - 指向函数成员的已删除指针的类型

c++ - << s.str() 和 << s.rdbuf() 之间的区别

c++ - 我如何转发声明一个类并稍后在 C++ 中使用它的成员函数?