【问题标题】:Make the compiler tell which methods are not concrete instead of erroring 'invalid new-expression of abstract class type'让编译器告诉哪些方法不是具体的,而不是错误“抽象类类型的无效新表达式”
【发布时间】:2018-02-21 09:33:03
【问题描述】:

每次我向抽象类添加一个非具体的虚拟方法时,编译器都会在派生自该抽象类的所有类上给出无用的错误invalid new-expression of abstract class type '...',然后我需要执行git diff 来搜索我之前添加的新方法,或者在 GCC 的错误中查找注释。 (添加方法和编译之间可能会有几天的差异)

我可以在 C++ 中指定一个类必须是具体的(如果它没有说明原因/缺失方法)吗?

【问题讨论】:

  • 您能否澄清“在 GCC 的错误中查找注释”是什么意思,特别是,为什么这样做不是您想要的?编译器错误报告包含与该错误相关的所有消息,而不仅仅是“错误”的单行。
  • @Angew 因为有很多文件是同时编译的(它是一个makefile),而GCC 会写关于它们的各种东西。搜索错误,阅读下面几行会消耗大量时间,我在问题中所说的任务发生了很多。
  • “添加方法和编译之间可能会有几天的差异” - 我完全误解了你的意思,或者你有一个不寻常的开发程序。
  • 或 grep 与 -B -A -C -n stackoverflow.com/questions/9081/…

标签: c++ abstract-class virtual-functions


【解决方案1】:

回答手头的问题:

我能否在 C++ 中指定一个类必须是具体的(如果它没有说明原因/缺失方法)?

C++ 没有明确的 abstractconcrete 类。这些概念隐含在语言中。 抽象隐含在一个或多个纯虚成员函数的存在(在类本身或继承)中,而具体隐含在这些函数的缺失中。

这正是 C++ 标准定义 abstract 类的方式(第 13.4/2 节)

[class.abstract]

抽象类是只能用作其他类的基类的类;抽象类的任何对象都不能被创建,除非是从它派生的类的子对象。 一个类是抽象的,如果它至少有一个纯虚函数

在 C++ 中没有诸如 Java 的 abstract 这样的关键字。

编译器错误消息是您可以捕获错误的标准位置,例如尝试实例化仍然具有纯虚成员函数的类。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多