【问题标题】:Visual Studio doesn't include headerVisual Studio 不包含标题
【发布时间】:2018-03-03 18:20:08
【问题描述】:

这是我的 BoardField.h:

#pragma once

#include "ChessPiece.h"
#include "Game.h"
#include <SDL.h>

class BoardField{
private:
    ChessPiece m_piece;
    SDL_Rect m_field;

public:

    friend class Game;
};

游戏.h

#pragma once

#include "BoardField.h"

class Game {
private:
    //members
    BoardField* m_board_fields; // 16th line
    ...

    //methods
    ...
public:
    ...
};

我在尝试编译时在 VS2017 中遇到了这些错误:

问题出在哪里?即使尝试创建新项目它也不起作用。

【问题讨论】:

  • 第 16 行是哪一行?我认为第二个代码块是game.h?如果只编译发布的代码,是否会出现错误?
  • BoardField.h 包括 Game.h,其中包括 BoardField.hBoardField 取决于 Game 取决于 BoardField 取决于 Game 哪个...等等永远。其中一个类将在声明之前使用。做一些关于循环包含循环依赖前向声明的研究。
  • @Someprogrammerdude 如何避免它并能够让班级成为朋友?
  • @FaustasButkus 再次对提到的项目进行一些研究。特别是“前向声明

标签: c++ visual-studio visual-studio-2017


【解决方案1】:

要打破循环引用,您应该使用前向引用。由于您使用的是原始指针,这就是所需的全部:

#pragma once

class BoardField;

class Game {
private:
    //members
    BoardField* m_board_fields;
    ...

    //methods
    ...
public:
    ...
};

当然,在Modern C++ 中,您应该避免使用原始指针。对于私有堆分配等情况,unique_ptr 在大多数情况下是最佳选择:

#pragma once

#include <memory>

class BoardField;

class Game {
private:
    //members
    std::unique_ptr<BoardField> m_board_fields;
    ...

    //methods
    ...
public:
    ...
};

你应该阅读this blog post

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多