【问题标题】:How to cross include classes in C++?如何在 C++ 中交叉包含类?
【发布时间】:2023-04-04 13:23:01
【问题描述】:

我正在尝试编写一个小游戏,其中轨道上有砖块。

我的问题是我想在轨道类中有一个砖块向量,但我需要在砖块类中保留一个指向轨道的指针。

我想做的是有两个头文件 track.h 和brick.h,我想在brick.h 文件中包含track.h,反之亦然。

brick.h:

#pragma once

#include "track.h"

class brick
{
    public:
        brick (track &theTrack);
    private:
        track *mTrack;
};

brick::brick(track &theTrack)
{
    mTrack = &theTrack;
}

track.h:

#pragma once

#include "brick.h"

class track
{
    public:

    private:
        vector<brick> brickPositions;
};

但是这会导致编译错误。

我不为这些类使用 .cpp 文件,只使用一个顶部带有 #pragma 的单个 .h 文件。

您能解释一下问题是什么,我该如何解决?

【问题讨论】:

标签: c++ class oop pointers header-files


【解决方案1】:

你可以做前向声明:

 #pragma once

class brick;
class track
{
    public:

    private:
        vector<brick> brickPositions; //This might not compile, should be a pointer
};

但是你需要有 cpp 文件。

track.cpp:

    class brick
    {
        public:
            brick (track &theTrack);
        private:
            track *mTrack;
    };

    brick::brick(track &theTrack)
    {
        mTrack = &theTrack;
    }

反之亦然(在类砖之前前向声明轨道),因为您只使用指针来追踪类砖。

附:接受下面的答案:)

【讨论】:

  • brick 真的可以前向声明用于向量 吗?至少投了赞成票。
  • 我的第一反应是你不能转发声明brick,因为track 实例化了它。但它实际上并没有实例化brick。它实例化了一个brick 的向量,而一个向量实际上是一个固定大小的对象,其中包含一个指向动态分配内存的指针。我用VC++11试了一下,编译没有错误。当然,这并不意味着什么......
  • 标准要求容器元素类型必须完整。
【解决方案2】:

由于brick 类只有一个指向track 类的指针,您可以使用前向声明。

#pragma once

class track;

class brick
{
    public:
        brick (track &theTrack);
    private:
        track *mTrack;
};

brick::brick(track &theTrack)
{
    mTrack = &theTrack;
}

您无需更改 track 类。

【讨论】:

  • 这是更好的答案。我没有注意到轨道有变砖(只是复制和粘贴)。
  • 三件事:对指针使用初始化列表会更好; #pragma once 不是 100% 可移植的(还),使用包含保护(除了或代替,这是你的选择);如果要使用前向声明,则不需要在头文件中包含头文件,将其推送到定义文件中。
  • 感谢您的回答,@Ferruccio,但经过数小时后我仍然无法解决。我的问题是我无法从砖块访问任何轨道。这是骨架代码:pastebin.com/cgfz1zA1
  • @caius 删除"include "track.h"",用砖类的实现定义轨道类(在brick::brick(track &theTrack)之前)。
猜你喜欢
  • 2018-10-17
  • 2010-11-28
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多