无法实例化抽象类我认为我搞砸了我的构造函数 C++

Posted

技术标签:

【中文标题】无法实例化抽象类我认为我搞砸了我的构造函数 C++【英文标题】:Can not instantiate Abstract class i think Im screwing up my Constructors C++ 【发布时间】:2012-10-24 23:15:17 【问题描述】:

所以我是 C++ 的初学者,我正在使用一个名为 VBot 的抽象类,我在其中继承到其他机器人类。现在我知道我需要覆盖 VBot 类中的纯虚拟代码,所以我认为这不是问题所在。我认为因为我对 C++ 缺乏经验,所以我在构造函数上做错了一些事情,因为我不断得到无法实例化抽象类。 这是 VBot.h 文件

class VBot

public:

    VBot( int startX, int startY, Panel ^ drawingPanel ) : 
      x(startX), y(startY), panel(drawingPanel), energy(100), image(NULL)  ;

virtual ~VBot()  ;


virtual void Move() = 0;

virtual int EnergyToFightWith() = 0;

bool IsDead() const  return energy <= 0; 

virtual void Show();

bool CollidedWith ( VBot * b ) const;

void DoBattleWith ( VBot * b );

protected:
     int x, y;                           // Current position of the VBot
     gcroot<Drawing::Bitmap ^> image;    // Image displayed for the VBot
     gcroot<Panel ^> panel;              // Panel on which to show the VBot.
     int energy                          // Current energy of the VBot

;
class CNNBot : public VBot

public:
CNNBot( int startX, int startY, Panel ^ drawingPanel )
    VBot::VBot(startX,startY,drawingPanel);
    image = gcnew Drawing::Bitmap("HappyBot.bmp");
~CNNBot();

void Move();

int EnergyToFightWith();
bool IsDead()  return (VBot::IsDead()); 
virtual void Show()  VBot::Show();
bool CollidedWith ( VBot * b )  return VBot::CollidedWith(b);
void DoBattleWith ( VBot * b ) VBot::DoBattleWith(b);

private:
static const int MOVE_VAL = 55;
static const int RIGHT_BOUND = 490;
static const int DOWN = 40;
static const int MAXY = 379;
bool switcher;

;

这将是 VBot.cpp

#include "stdafx.h"     

#include "Vbot.h"

void VBot::Show()
 
  Graphics ^ g = panel->CreateGraphics();
  g->DrawImageUnscaled( image, x, y );
  g->~Graphics();



bool VBot::CollidedWith ( VBot * b ) const

if (  b == NULL )
  return false;

return   ( x + image->Width ) >= b->x
     && ( b->x + b->image->Width ) >= x
     && ( y + image->Height ) >= b->y
     && ( b->y + b->image->Height ) >= y;




void VBot::DoBattleWith ( VBot * b )

   int mine = EnergyToFightWith();
   int yours = b->EnergyToFightWith();
   if( mine == yours )

   energy = energy - mine / 2;
   b->energy = b->energy - yours / 2;

else if ( mine > yours )

   if ( b->energy > 1 )
   
      b->energy = b->energy - yours;
      energy = energy + yours / 2;
   
   else
   
      b->energy = b->energy - 1;
      energy = energy + 1;
   

else

    if ( energy > 1 )
    
       energy = energy - mine;
       b->energy = b->energy + mine / 2;
    
    else
    
       b->energy = b->energy + 1;
       energy = energy - 1;
    
  

int CNNBot::EnergyToFightWith()

return this->energy;

所以错误是无法实例化抽象类,所以我认为它正在尝试构造 VBot 而不是 CNNBot,因为在输出中它给了我 void VBot::Move(void)' : 是抽象的 和 'int VBot::EnergyToFightWith(void)' : 是抽象的

对不起,我忘了在这里添加那部分是 Move()

 void CNNBot::Move()

if (this->switcher)

    this->x += MOVE_VAL;
    if( this->x >= RIGHT_BOUND)
    
        this->x = 0;
        this->y += DOWN;
        if(this->y > MAXY)
        
            this->switcher = false;
            this->y = MAXY;
        
    

else

    this->x += MOVE_VAL;
    if( this->x >= RIGHT_BOUND)
    
        this->x = 0;
        this->y -= DOWN;
        if(this->y < 0)
        
            this->switcher = true;
            this->y = 0;
        
    

panel->Invalidate();

无论你们能提供什么帮助,这位新手程序员都将不胜感激。

【问题讨论】:

【参考方案1】:

要调用父类的构造函数,你需要把它放在初始化列表中:

CNNBot( int startX, int startY, Panel ^ drawingPanel ):
    VBot(startX, startY, drawingPanel)

    image = gcnew Drawing::Bitmap("HappyBot.bmp");

你有这个,它试图创建然后扔掉一个无名的VBot对象:

CNNBot( int startX, int startY, Panel ^ drawingPanel )
    VBot::VBot(startX,startY,drawingPanel);
    image = gcnew Drawing::Bitmap("HappyBot.bmp");

【讨论】:

完美,非常感谢您现在回到解决程序的其余部分。【参考方案2】:

您没有覆盖 Move() 并且根据定义,具有任何纯虚函数的类是抽象的,不能被实例化。给Move一个身体,你应该很好。

【讨论】:

以上是关于无法实例化抽象类我认为我搞砸了我的构造函数 C++的主要内容,如果未能解决你的问题,请参考以下文章

我搞砸了,我该如何卸载我的程序?

scikit-learn 回归预测结果太好了。我搞砸了啥?

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

hibernate 搞砸了我的查询

Outlook 自动清理我的换行符并搞砸了我的电子邮件格式

Gradle 在 Android Studio 中搞砸了我的应用程序,如何修复?