C ++对象声明被称为抽象

时间:2014-01-29 07:40:24

标签: c++

出于某种原因,我收到的错误以前没有显示过。该错误表明不允许抽象类型InitializeState的对象。但是,之前我没有遇到过此问题,而且我没有对这两个文件进行任何更改。 这是头文件:

#ifndef InitializeState_h
#define InitializeState_h
#include "State.h"
#include "SFML/Graphics.hpp"


class InitializeState : public State{
    public:
        void Load(sf::RenderWindow*);
        //void Load();
        void Handling(SEngine* gameEng);
        void Paint(SEngine* gameEng);
        void Update(SEngine* gameEng);
        void TidyUp();
        void Halt();
        void Continue();
        static InitializeState* Initialize(){
            return &gameStart;
        }


    protected:
        InitializeState() {}

    private:
        static InitializeState gameStart;
};


#endif

以下是发生错误的c ++文件:

#include "InitializeState.h"
#include "State.h"
#include "SEngine.h"

#include <SFML/Graphics.hpp>



InitializeState InitializeState::gameStart;

void InitializeState::Load(sf::RenderWindow* window){
    rwindow = window;
    rwindow->create(sf::VideoMode(200,200), "Working");
};

void InitializeState::Handling(SEngine* gameEng){

};

void InitializeState::Paint(SEngine* gameEng){


};

void InitializeState::Update(SEngine* gameEng){

};

void InitializeState::Continue(){
};

void InitializeState::Halt(){
};

第五行代码InitializeState InitializeState :: gameStart;是发生错误的地方。

这是错误窗口:

1>------ Build started: Project: 2D Game, Configuration: Debug Win32 ------
1>  SEngine.cpp
1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\sengine.cpp(26): error C2660: 'State::Handling' : function does not take 1 arguments
1>  Main.cpp
1>  InitializeState.cpp
1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\initializestate.cpp(9): error C2259: 'InitializeState' : cannot instantiate abstract class
1>          due to following members:
1>          'void State::Handling(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(14) : see declaration of 'State::Handling'
1>          'void State::Paint(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(15) : see declaration of 'State::Paint'
1>          'void State::Update(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(16) : see declaration of 'State::Update'
1>  Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

2 个答案:

答案 0 :(得分:0)

如果您实施

void State::Handling(void) override;
void State::Paint(void) override;
void State::Update(void) override;

从班级State你会没事的。

在覆盖时需要使用virtual关键字,否则执行方法隐藏。

课程State要求您实施上述方法,无论您使用SEngine参数等不同签名所需的任何类似方法。

这是你在这里缺乏的基本OOP知识。我建议你读一本像Thinking in C ++ 1和2这样的书,以便在弄乱引擎之前先了解一下。

编辑:您的代码的另一个问题:您继承的析构函数必须至少是虚拟的,而不是使用MS专有关键字sealed。你可能会或者可能会在这里遇到一些内存泄漏。

一些阅读:When to use virtual destructors?

修改:添加了新的c ++ 11 override糖,删除了virtual。学到了新东西:)

答案 1 :(得分:0)

  

错误是声明抽象类型InitializeState的对象是   不允许。

这通常意味着类型父级的某些虚拟纯函数未在子级中实现。基本上,你错过了InitializeState中的一些函数定义。

1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\initializestate.cpp(9): error C2259: 'InitializeState' : cannot instantiate abstract class
1>          due to following members:
1>          'void State::Handling(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(14) : see declaration of 'State::Handling'
1>          'void State::Paint(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(15) : see declaration of 'State::Paint'
1>          'void State::Update(void)' : is abstract
1>          c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(16) : see declaration of 'State::Update'

在这里,您可以看到Stateize类中缺少InitializeState类的成员函数列表。这是因为这些函数是纯虚函数:它们是“必需”由至少一个子类实现的。

只需在InitializeState中实现它们即可解决您的问题。