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