当前位置: 首页 > 知识库问答 >
问题:

不能实例化抽象类,但类不是抽象的

刘令
2023-03-14

我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示:

命令H

#ifndef _COMMAND_H_
#define _COMMAND_H_

#include <string>
#include "Stack.h"
#include "Number.h"

class Command
{
public:
    std::string cmdType;
    Command(void);
    Command (std::string cmdType);
    virtual void executeCommand(Stack<Number> & stack) = 0;
    ~Command (void);
};

#endif   // !defined _COMMAND_H_

命令cpp

Command::Command(void)
    :cmdType("")
{}

Command::Command(std::string cmdType)
    :cmdType(cmdType)
{}

Command::~Command(void)
{}

数字H

#ifndef _NUMBER_H_
#define _NUMBER_H_

#include "Command.h"
#include "Stack.h"

class Number : public Command
{
public:
    Number (float num);
    void executeCommand(Stack<Number> & stack);
    float val;
    ~Number (void);
};

#endif   // !defined _NUMBER_H_

数字cpp

#include "Number.h"

Number::Number(float num)
    :val(num)
{
    cmdType = "hi";
}

void Number::executeCommand(Stack<Number> & stack)
{
    stack.push((*this));
}

发生文件错误:

Error   4   error C2259: 'Number' : cannot instantiate abstract class   c:\...\add.cpp  34

一个dd.cpp

#include "Add.h"

Add::Add(void)
    :Binary("+")
{

}



Add::~Add(void)
{

}


void Add::executeCommand(Stack<Number> & numStack)
{
    Number num1 = numStack.top(); //THIS LINE HAS THE ERROR
    numStack.pop();
    Number num2 = numStack.top();
    numStack.pop();

    float tempVal = num2.val + num1.val;

    num1.val = tempVal;

    numStack.push(num1);

}

添加H

#ifndef _ADD_H_
#define _ADD_H_

#include "Stack.h"
#include "Number.h"
#include "Binary.h"

class Add : public Binary
{
public:

  Add (void);
  void executeCommand (Stack<Number> & numStack);
  ~Add (void);

};

#endif   // !defined _ADD_H_

共有1个答案

东郭远航
2023-03-14

这是一个循环依赖问题。

  • 命令。h包括编号。h
  • 数字。h包括命令。h

通常它是通过用前置声明替换其中一个包含来解决的,尝试在命令. h中向前声明Number,而不是包含Number. h;将包含移动到Command.cpp

 类似资料:
  • 所以我有两个类。一个只有纯粹的虚拟函数。另一个实现了这些函数,并从第一个类派生出来。我知道我不能实例化第一个类。但是当我试图创建第二个类的对象时,它也失败了。 我的第二节课大体上是这样的: 执行: 下面是我如何实例化它并得到错误: 我哪里做错了? 第一课

  • 我正在尝试实现上面提到的解决方案,但是在这里,我得到了一个错误“RowMapper是抽象的,不能实例化”和“表达式的非法开始”。下面正是我所说的

  • 问题内容: 我创建了一个空的抽象类,并从中继承了该类: 我期望输出是 但是,我得到的是 如果我删除(这样就变成一个普通的类)和/或如果我设置了其他值,问题(显然)就消失了。 这里发生了什么? 问题答案: 这实际上不是ABC的问题,而是PyMongo的问题。有一个关于它的问题在这里。似乎pymongo重写以返回某种数据库类。这意味着将返回一个数据库对象,该对象在布尔上下文中为true。这使ABCMe

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 第一次来这里。我是C新手,花了好几个小时想弄明白这个问题。很抱歉问一个似乎很常见的问题。我一生都找不到答案。 我在visual studio中遇到以下编译错误: 我的理解是,这意味着我创建的纯虚拟函数尚未在子类中实现。据我所见,它已在intNode子节点中实现。我做错了什么?代码如下。提前谢谢! 在节点中。h: 在Node.cpp: 编辑...对不起,我忘了添加这个位。错误指向main中的此部分

  • 问题内容: 因此,我一直在为编程类编写抽象作业,但遇到了问题。我现在的目标是能够使用抽象,然后能够使用矩形和椭圆形绘制一个简单的城市,例如矩形建筑物或灯柱上的椭圆形灯。 我在编译时收到的错误是:MyTestApp.Rectangle不是抽象的,并且不会覆盖MyTestApp.Shape中的抽象方法drawEllipse(java.awt.Graphics)。该错误显示在类Shape下方的“矩形扩展