我正在构建俄罗斯方 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/