C++ E0322:抽象类类型的对象&引用;不允许

C++ E0322:抽象类类型的对象&引用;不允许,c++,abstract-class,pure-virtual,C++,Abstract Class,Pure Virtual,我的头文件中有一个纯虚拟函数和一个静态类实例: static Class mInstance; 我得到以下错误: 不允许抽象类类型为“class”的对象:函数“”是 纯虚函数 这意味着什么?我如何解决这个问题 更多详情: 我希望在其他非派生类中使用minInstance变量。纯虚函数正被派生类重写。请问我应该提供什么样的细节?MinInstance变量正与我编写的FactoryMethod一起使用。当您创建一个抽象类时,您告诉编译器没有理由创建该类本身的实例。这通常是在您为一个base类定义一

我的头文件中有一个纯虚拟函数和一个静态类实例:

static Class mInstance;
我得到以下错误:

不允许抽象类类型为“class”的对象:函数“”是 纯虚函数

这意味着什么?我如何解决这个问题

更多详情:


我希望在其他非派生类中使用minInstance变量。纯虚函数正被派生类重写。请问我应该提供什么样的细节?MinInstance变量正与我编写的FactoryMethod一起使用。

当您创建一个抽象
类时,您告诉编译器没有理由创建该类本身的实例。这通常是在您为一个base
类定义一组接口方法和/或字段时完成的,该类应适用于各种继承类,但不适用于base本身。所以,编译器可以帮助您避免意外错误,并且不允许创建实例。因此,有两种可能的解决方案:

  • 您错误地将您的
    抽象化了,不应该这样做。解决方案很简单,只需使所有虚拟函数不纯粹并实现它们

  • 你的
    应该是抽象的。那么您就不应该拥有这个类的实例,不管是静态的还是非静态的。通常,当您有接口时,您使用指向基类的指针或引用,并将它们分配给实现该接口的派生类。在您的情况下应该做什么还不清楚,因为我们没有足够的信息,在您的情况下,最简单的方法是将该静态变量作为指针(可能是智能变量)并将其分配给某个派生类的实例


  • 正如错误所说,不允许创建抽象类型。我们需要更多关于您试图实现的目标的详细信息,以便告诉您如何重构代码。请共享
    类的定义。最可能的情况是,它有一个或多个抽象函数,或者它的一个基本类型是抽象的,没有人提供实现。如果
    Class
    有一个或多个纯虚拟函数,则无法创建该类的实例。(1)使该函数成为非纯函数(即删除使虚拟函数成为纯函数的
    =0
    )或(2)从
    派生类,使该派生类重写该纯虚拟成员函数,并创建该派生类的实例(例如,将
    静态类MinInstance
    更改为
    静态SomeDerivedClass MinInstance
    )@SalvadorDalí-具有纯虚函数的类的目的是确保基类不能实例化,并且任何派生类都不能实例化,除非它们重写该函数(并且不要以保持纯虚拟的方式重写)。因此,要求使用纯虚拟创建类的实例是有缺陷设计的标志。要求类具有纯虚拟函数和要求实例化该类是相互排斥的(这些要求中只有一项可以满足,但两者永远不能同时满足)。重构代码是不够的。您要么需要删除类具有纯虚拟函数的要求,要么需要删除创建该类实例的要求。还有很多事情无法在代码中完成—在您的例子中,是一种用于故意阻止“X”的代码构造“从发生”和另一个试图故意使“X”发生的代码构造不能同时有效。允许类定义(实现)纯虚拟函数,但这样做不会使该函数“不纯”。纯虚函数的要点是它必须被派生类重写,否则派生类也无法实例化。@Peter good point,更改了措辞以减少混淆。谢谢。