C++ - 不能将变量声明为抽象类型

Posted

技术标签:

【中文标题】C++ - 不能将变量声明为抽象类型【英文标题】:C++ - Cannot declare variable to be of abstract type 【发布时间】:2015-10-08 10:12:39 【问题描述】:

我正在尝试用 C++(用于 OpenFOAM)编写一些代码,但我收到了标题中给出的这段代码的错误:

// Copy set
void backup 
(
   const polyMesh& mesh,
   const word& fromName, 
   const topoSet& fromSet,
   const word& toName
)

   Info<< "Backing up " << fromName << " into " << toName << endl; 

   topoSet backupSet(mesh, toName, fromSet);

   backupSet.write();

完整的错误是:

faceSet.C:51:18: error: cannot declare variable ‘backupSet’ to be of abstract type ‘Foam::topoSet’ 

错误在这一行:

topoSet backupSet(mesh, toName, fromSet);

通过查找这个,我想我明白 topoSet 可能应该被声明为一个常量,但我尝试了这个,它没有任何区别。

我有一些类似性质的错误,但我只是想了解如何解决这个错误。

【问题讨论】:

好的,它有几百行,我不确定它的哪一部分最好包含,所以我可以以某种方式将它作为文件发送?有没有办法做到这一点? 不,没有。你应该构造一个minimal testcase,至少部分是因为这应该是你在互联网上进行预询问的第一个调试步骤。 不确定你是如何从研究抽象类中得出“也许应该被声明为常量”的! @LightnessRacesinOrbit, topoSet 实际上是来自框架 (OpenFOAM) 的一个类,我认为对于有关某些框架的所有问题,我认为您不需要将所有框架类都转换为 MVCE。不过,我并不是说这个问题已经过充分的研究。 @Petr:在这种情况下,将 OpenFOAM 引用为未包含的依赖项就可以了。最重要的是我对 OP 声明的总体回应 “好的,它有几百行,我不确定它的哪一部分是最好的,所以我可以以某种方式将它作为文件发送” i> 因为这根本不是这样工作的。 【参考方案1】:

您不能创建topoSet 实例,因为它是一个包含虚拟未实现方法的抽象类(maxSize() 似乎是其中之一)。即使没有未实现的(纯虚拟)成员,创建topoSet 实例也是错误的,因为您将丢失有关fromSet 的原始类型以及它在topoSet 之上的所有数据的所有信息的(这类似于slicing)。

我认为您应该使用topoSet::New() 静态函数之一(命名构造函数),或者如果您只需将其保存为不同的名称,那么只需使用两次topoSet::rename()(实际上是regIOobject::rename()) .

【讨论】:

【参考方案2】:

您不能使用 topoSet backupSet;,因为这会尝试实例化 topoSet,因为它是抽象的,所以您不能这样做。

您需要创建一个具体派生类的实例。您需要找到合适的东西或自己创建它。如果我们假设这样的东西被称为foo,那么你可以使用指针

topoSet* backupSet = new foo(/*ToDo - parameters*/)

或实例化目录foo backupSet(/*ToDo - parameters, omit the parentheses if there are no parameters*/)

【讨论】:

以上是关于C++ - 不能将变量声明为抽象类型的主要内容,如果未能解决你的问题,请参考以下文章

007-declare 声明变量的类型

c++ 中如何声明一个 int 变量

变量声明和定义

C++中的声明和定义

C++ 枚举类型声明可以放在 int main 的前面吗?

将变量声明为“类”数据类型,而不调用“类”构造函数?