Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误c2143&;c4430声明从具有虚拟函数的基类派生的对象时_C++_Sdl - Fatal编程技术网

C++ 错误c2143&;c4430声明从具有虚拟函数的基类派生的对象时

C++ 错误c2143&;c4430声明从具有虚拟函数的基类派生的对象时,c++,sdl,C++,Sdl,这是我第一次在stackoverflow上发帖,希望这是遵守所有的礼仪 我试图使用C++的SDL 1 .x扩展库来创建和实现一个按钮类,用于使用有限状态机与个人项目一起使用。我有一个带有虚拟函数的基类“Button”,一个从Button派生的类“MenuButton”,还有一个试图创建MenuButton的“Title”状态 我正在使用Microsoft Visual Studio 2012,Intellisense说我的代码是正确的。然而,当我尝试编译时,我收到以下两个错误: title.h(

这是我第一次在stackoverflow上发帖,希望这是遵守所有的礼仪

我试图使用C++的SDL 1 .x扩展库来创建和实现一个按钮类,用于使用有限状态机与个人项目一起使用。我有一个带有虚拟函数的基类“Button”,一个从Button派生的类“MenuButton”,还有一个试图创建MenuButton的“Title”状态

我正在使用Microsoft Visual Studio 2012,Intellisense说我的代码是正确的。然而,当我尝试编译时,我收到以下两个错误:

title.h(35):错误C2143:语法错误:缺少“;”在“*”之前

title.h(35):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/P> 我花了几个小时试图自己解决这个问题。我搜索过谷歌,也搜索过stackoverflow,但尽管我看到和阅读过许多其他有类似问题的帖子,但似乎没有一篇与我的问题相同

基于其他人发布的其他类似问题以及他们接受的答案,我已经搜索了:#包含循环问题,确保类声明具有最终结果;,并确保所有的#包括在内(据我所知)

下面是代码片段,如果有人能告诉我如何解决这个问题,我将非常感谢他们的智慧和帮助

多谢各位

Button.h(基类)

Title.h(创建按钮并抛出错误的状态)

#如果没有标题#
#定义标题
#包括“GameState.h”
#包括“SDL.h”
#包括“SDL_image.h”
//#包括“SDL_Mixer.h”
#包括“Functions.h”
#包括“Globals.h”
#包括“Constants.h”
#包括“MenuButton.h”
#包括
#包括
使用名称空间std;
课程名称:
公共游戏状态
{
公众:
所有权(无效);
//处理介绍事件
void handleEvents();
//处理介绍逻辑
无效逻辑();
//处理简介渲染
void render();
~所有权(无效);
私人:
SDL_表面*背景;
MenuButton*testButton;//注意:这是抛出错误的行
//混合音乐*音乐;
};
#恩迪夫

谢谢你的帮助~ 编译器似乎不知道菜单按钮是什么。出现这种情况的一个原因是
菜单按钮也由另一个标题定义。更有可能的是,类似于
Globals.h
的内容还包括
“title.h”
,也就是说,您的系统中有一个依赖循环。如果您知道类是循环依赖的,那么最好删除这些循环。有很多方法可以做到这一点。即使你现在认为你需要循环依赖,它也不好,可能不需要(John Lakos的“大规模C++设计”书包含了很多关于如何打破依赖循环的信息)。 如果您不知道循环从何而来,我建议在编译器中使用
-E
(或
/E
)标志:此选项通常在预处理后生成翻译单元。它将包含以某种形式输入文件的指示。预处理输出的外观取决于编译器,但您将能够看到编译器看到的内容,并且您可能可以找到
MenuButton
未声明的原因

作为一种简单的解决方法,您还可以确保声明了
MenuButton
:要形成指针,不需要它的定义。在实际访问指针时,您已经看到定义就足够了。声明应该是这样的:

class MenuButton;

。。并且可以使用
菜单按钮
在每个翻译单元中重复,以声明
菜单按钮
的指针或引用成员。您甚至可以仅通过一个声明,按值声明返回或传递
菜单按钮的函数。当然,当您想要实际使用该类型时,您需要查看它的定义。

编译器似乎不知道什么是
菜单按钮。出现这种情况的一个原因是
菜单按钮也由另一个标题定义。更有可能的是,类似于
Globals.h
的内容还包括
“title.h”
,也就是说,您的系统中有一个依赖循环。如果您知道类是循环依赖的,那么最好删除这些循环。有很多方法可以做到这一点。即使你现在认为你需要循环依赖,它也不好,可能不需要(John Lakos的“大规模C++设计”书包含了很多关于如何打破依赖循环的信息)。 如果您不知道循环从何而来,我建议在编译器中使用
-E
(或
/E
)标志:此选项通常在预处理后生成翻译单元。它将包含以某种形式输入文件的指示。预处理输出的外观取决于编译器,但您将能够看到编译器看到的内容,并且您可能可以找到
MenuButton
未声明的原因

作为一种简单的解决方法,您还可以确保声明了
MenuButton
:要形成指针,不需要它的定义。在实际访问指针时,您已经看到定义就足够了。声明应该是这样的:

class MenuButton;

。。并且可以使用
菜单按钮
在每个翻译单元中重复,以声明
菜单按钮
的指针或引用成员。您甚至可以仅通过一个声明,按值声明返回或传递
菜单按钮的函数。当然,当您想要实际使用该类型时,您需要查看它的定义。

错误的直接原因是编译器不知道
菜单按钮应该是什么。因为你包含了一个标题
#ifndef TITLE_H
#define TITLE_H

#include "GameState.h"
#include "SDL.h"
#include "SDL_image.h"
//#include "SDL_Mixer.h"
#include "Functions.h"
#include "Globals.h"
#include "Constants.h"
#include "MenuButton.h"
#include <iostream>
#include <string>

using namespace std;

class Title :
    public GameState
{
public:
    Title(void);

    //Handles intro events
    void handleEvents();

    //Handles intro logic
    void logic();

    //Handles intro rendering
    void render();

    ~Title(void);
private:
    SDL_Surface *background;
    MenuButton *testButton; //NOTE: This is the line throwing the errors
    //Mix_Music *music;
};

#endif
class MenuButton;