c++ - 循环包含

标签 c++ class include

我正在构建俄罗斯方 block ,并试图避免指针。在下面的代码中,我试图在另一个类 “TetrisWindow” 中定义一个类 “ButtonQuit” 的实例,这两个类都使用彼此的方法。我不断收到错误消息:

‘ButtonQuit’ does not name a type: ButtonQuit btnQuit;

或:

field ‘btnQuit’ has incomplete type: ButtonQuit btnQuit;

我知道有一个循环包含,但我不知道如何解决这个问题。我试过向前声明 ButtonQuit,它不起作用。

(WindowSDL 只是一个包含所有图形功能的类,除了 SDL 之外,它没有包含在其中。)

这是我的代码(当我编译它时出现“没有命名类型”错误):

BUTTONQUIT.HPP:

#ifndef __BUTTONQUIT__
#define __BUTTONQUIT__

#include <TetrisWindow.hpp>

class ButtonQuit{

private:

int x,y;
TetrisWindow win;

public:

ButtonQuit (TetrisWindow, int, int);
~ButtonQuit();
void print(void);
void action(void);
bool clicked(int, int);


};

#endif

TETRISWINDOW.HPP:

#ifndef __TETRISWINDOW__
#define __TETRISWINDOW__

#include <cstdint>
#include <string>
#include <vector>

#include <WindowSDL.hpp>
#include <ButtonQuit.hpp>

class TetrisWindow: public WindowSDL{

protected:

ButtonQuit btnQuit;
void handleEvent(SDL_Event&);
void work(void);

public:

TetrisWindow();
TetrisWindow(uint16_t, uint16_t);
TetrisWindow(const TetrisWindow& w);
~TetrisWindow();

void drawWindow(void);

};

#endif

最佳答案

问题不在于您的情况中的循环包含,这是次要问题。

您应该考虑的第一个问题是 TetrisWindow 有一个 ButtonQuit 成员,而 ButtonQuit 有一个 TetrisWindow成员(member)。

这两个成员既不是指针也不是引用,这意味着它们将以整个大小存储在包含类中。这导致了一个没有结束的递归结构。

TetrisWindow 必须包含一个 ButtonQuit,其中必须包含一个 TetrisWindow,而 TetrisWindow 必须包含一个 ButtonQuit...

这里的解决方案是在各自的其他 header 中转发声明这两个类,并改用指针/引用,例如:

// TetrisWindow.h
class ButtonQuit;

class TetrisWindow {
  private:
    ButtonQuit* button;
  ...
}

// ButtonQuit.h
class TetrisWindow;

class ButtonQuit {
  private:
    TetrisWindow* window;
  ...
}

现在您使用指针作为成员,因此编译器不必为定义知道 sizeof(ButtonQuit)sizeof(TetrisWindow),因为指针是总是一个指针。这允许您根本不包含其他类的 header ,只要您没有试图访问不完整类型的内联函数。

关于c++ - 循环包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103197/

相关文章:

types - 主程序无法识别 INCLUDE 中的声明

java - 在android编程中使用<include/>

c++ - 将多个带有 vector 的 map 合并为一张 map

c++ - 如何使用 Boost Spirit 提取修剪后的文本?

c++ - DLL注册和注销

c++ - 更好地了解C++中的类

Python 前缀/中缀/后缀表达式求值

android - 多次重用布局时如何访问布局内的 View ?

c++ - Xerces-C 使用硬编码 xsd 验证 xml

java - 将 .class 文件添加到 Eclipse 项目