群集有标识符错误

时间:2017-12-08 02:50:14

标签: c++ inheritance include virtual-functions undeclared-identifier

我一直在为一个最终项目编写一个Monopoly游戏。所以我以为我是在滚动,并且我已经用我的伪代码弄明白了。但是,似乎我忘记了如何处理包括正确,我知道这是问题,因为我能够将其改进到那一点,但我不知道如何解决它。

在我的代码的这个超级精简版本中,我有三个.h文件“Space.h”,它是一个抽象/虚拟类,必须由可以出现在典型的各种不同空间继承垄断板:属性,监狱,税收,机会,公益金等。必须继承的功能是运行(播放器和放大器),这是当你降落在板上的特定空间时“运行”的所有功能使用run使用参数传递的玩家。

#pragma once
#include <string>
#include "Player.h"

class Space
{
public:
    virtual void run(Player&) = 0;
};

我的第二个.h文件是“Property.h”,它继承自Space

#pragma once
#include "Space.h"

class Property : Space
{
public:
    void run(Player&) override;
    int i{ 0 };
};

最后我有“Player.h”,它有两个变量名称和它拥有的属性向量。

#pragma once
#include <string>
#include <vector>
#include "Property.h"

class Player
{
public:
    std::string name{ "foo" };
    void addProperty(Property p);
private:
    std::vector <Property> ownedProperties;
};

这是一个非常基本的Property实现

#include "Property.h"
#include <iostream>

void Property::run(Player & p)
{
    std::cout << p.name;
}

玩家实施

#include "Player.h"
#include <iostream>

void Player::addProperty(Property p)
{
    ownedProperties.push_back(p);
}

最后是主要的

#include "Player.h"
#include "Space.h"
#include "Property.h"

int main()
{
    Player p{};
    Property prop{};
    prop.run(p);
    system("pause");
}

每次运行时我都会遇到一系列错误,我确信它必须使用循环包含逻辑,包含属性的播放器和包含播放器在内的空间属性。但是,我没有看到一个解决方法,考虑#include需要知道如何定义所有内容?或者这些错误是指其他什么?

enter image description here

1 个答案:

答案 0 :(得分:2)

您有一个循环包含问题。玩家包括属性,其中包括再次包含玩家的空间。

你可以通过在Space.h中不包括Player.h来破坏圆圈,只有前向声明类

#pragma once

class Player;

class Space
{
public:
    virtual void run(Player&) = 0;
};