问题标签 [pure-virtual]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1073 浏览

c++ - C++ 派生纯抽象 w/ 嵌套结构

我正在尝试设置类似于 c# 属性概念的语法糖。

我读过这篇文章:C#-like properties in native c++? . 这很有帮助,但缺乏我想要的设计。我也恭敬地不同意那里提出的几个断言,即属性概念是不好的 oo 形式,因为我看不出一组名为 get_id() 和 set_id() 的方法与暴露相同概念的运算符重载之间的区别,允许在使用类时代码更干净,并且通常不鼓励公共访问私有字段,还将公共实现与私有设计解耦。

但是,我提出的代码(受该链接的启发)确实很笨拙,并且很难维护。我想知道是否有人对清理这个有任何建议,或者更重要的是,知道一个更好的方法来做到这一点。

编辑1:我突然想到我没有透露任何关于我的意图的信息。它将在调度程序中使用,我们将对类中的所有数据进行大量比较和分配。'someClass' 将有效地成为数据的接口(需要很少的方法,大量的数据应该是相对透明的)。它将在可执行文件将链接的静态库中定义。“derivedClass”实际上是一个外部实现,在动态加载的 dll 中实现。这样做的原因是启用 dll 与另一个实现不同文件后端的 dll 的“热交换”。我们计划使用插件系统来实现 xml、sqlite 和 mysql 存储后端来加载它们。

所以基本上,我需要一个设计,让someClass成为一个由derivedClass继承的虚拟接口,通过工厂方法加载,通过插件系统传递,最终由consumerClass使用。

0 投票
3 回答
3344 浏览

c++ - 使用 MinGW 编译并安装 FTGL 库以在 OpenGL 中渲染文本

语境

我正在使用 SDL 和 OpenGL 制作游戏引擎。我正在尝试找到使用精美的真字体将文本输出到屏幕的最佳方式,但我遇到了 FTGL。(如果您有更好/更简单的解决方案,请随时分享。)

编译 FTGL

它需要 FreeType2 才能工作,所以我得到了它,编译它(使用 Code::Block),然后我也使用 Code::Block 编译了 FTGL 库。

我正在使用带有 CDT 插件的 Eclipse Indigo。我不确定要采用哪个库,因为有一个.lib和一个.dll文件。我都试过了,但这似乎根本没有改变我的问题,目前就在这条线上:

错误是:

如果我使用另一个 FTfont 子类,例如 FTPixmapFont 构造函数,它不会改变。

这是我尝试过的链接器标志:

我正在使用 Eclipse 和 MinGW。

我已经复制粘贴了

  • src/FTGL文件夹和
  • Includefreetype 库文件夹的内容

includeMinGW 目录的文件夹。

freetype2(有freetype.lib,freetype248_D.libfreetype-bcc.lib, 不确定在项目属性中链接)和 ftgl ( ftgl.dll, ftgl_D.lib, ftgl_static_D.lib) lib 文件到 MinGW 目录的相应 lib 文件夹中。

如果我单击有错误的行并使用 Open Declaration 选项,eclipse 会将我带到FTTextureFontFTTextureFont(char const*)定义的头文件和定义的MakeGlyph函数。

如果您想查看更多内容或作为参考,您可以在GetRandomGame 项目页面上找到完整代码。

这是编译器版本


编辑

类似的问题:FTGL undefined references everywere?,但是那个问题的答案并没有解决我的问题,我仍然得到这两个错误。


编辑 2

当我第一次尝试使用 FTGL 并出现两个错误时,我正在使用 MSVC 进行编译。

我最终使用 code::block 来导入两个库提供的 MSVC 项目。两个错误之一得到了解决!但是,我还是得到了这个:


编辑 3

我尝试用 freetype 2.3.4 编译 FTGL 2.1.2,但这并没有解决我的问题。我已经尝试过使用 freetype 2.3.4 的 FTGL 2.1.3 rc5,同样的事情。可以肯定的是,我也尝试过 freetype 2.3.5 和 2.4.8(第一次已经是 2.4.8)。

我已经尝试将MakeGlyph代码移动到头文件中,但这并没有解决问题。

这是我找到的一些有用的链接,但它们还没有解决问题。


编辑 4

当我删除ftgl链接器标志时,编译器会抱怨这个:

而且我仍然得到纯虚拟方法MakeGlyph错误。

使用ftgl链接器标志,我得到的唯一错误是“必须实现继承的纯虚拟方法 MakeGlyph”。编译器可以很好地构建项目(但在启动时崩溃):

所以我认为 FTGL 库没有正确编译,因为它应该FTPixmapFont.cpp定义纯虚拟方法MakeGlyph。我对 C++ 中的所有这些 lib 东西有点陌生,我可能在构建 lib 时做错了什么。


编辑 5

我已经阅读并在一个示例中看到我需要一个config.h文件,因此我添加了一个正确配置的config.h文件,该文件随 FTGL 一起提供。

然后我在目录中提供的示例中找到了以下代码,ftgl并将其添加到我的Font课程中。

即使我MakeGlyph在那里定义,Eclipse 也会抱怨未实现的纯虚拟方法FTFont::MakeGlyph


编辑 6

我尝试使用 gdb 从命令行进行调试,它告诉我找不到 freetype6.dll。我现在正在努力寻找解决方案。

0 投票
3 回答
13960 浏览

c++ - 为什么纯虚拟/抽象类需要构造函数,特别是对于受保护的 const 成员变量?

我有一个这样定义的纯虚拟类:

如果我不添加这样定义的构造函数:

我必须随后在派生类中使用,我的派生类无法将 const 变量 var 初始化为它想要的任何值。现在我真的明白这里发生了什么。在构造派生类之前,调用基类的构造函数,此时必须初始化 const 成员变量。我的问题不是“我如何让我的代码工作”之类的问题,这已经完成了。我的问题是关于为什么编译器认为它是必要的。对于一个纯粹的虚拟课程,我不应该被允许写这样的东西:

如果编译器知道调用 BaseClass 构造函数之后必然会调用一些派生类构造函数(因为抽象类型的对象永远不能被实例化),它不应该给我们更多的余地吗?

这都是 C++ 选择绕过 Diamond 问题的结果吗?即使是这样,编译器不应该至少以某种方式允许纯虚函数的 const 成员变量将在派生类中定义的可能性吗?是不是太复杂了,或者这是否与钻石问题的 C++ 解决方案相混淆?

感谢大家的帮助。

0 投票
6 回答
3465 浏览

c++ - C++ 抽象类的问题(我可以用 Java 做,但不能用 C++!)

首先,我搜索了这个问题,发现了很多类似的问题,但我找不到解决我问题的答案。如果这只是我的愚蠢,我很抱歉。

我想做的是让抽象类的构造函数调用一个纯虚函数。在 Java 中,这是可行的,因为子类提供了被调用的抽象方法的实现。但是,在 C++ 中,我收到此链接器错误:

这是我的代码:

作为对我正在尝试做的事情的进一步解释,这里是实现我目标的 Java 代码:

此代码打印“是的!”。非常感谢任何帮助!

0 投票
2 回答
13753 浏览

c++ - 调用纯虚函数

可能重复:
在构造函数中调用虚函数

看看这段代码。在 Base 类的构造函数中,我们可以使用 'this' 指针调用纯虚函数。现在,当我想创建一个指向同一类的类型化指针并将“this”转换为同一类型时。它抛出运行时异常“纯虚函数调用异常”。为什么会这样?

0 投票
3 回答
845 浏览

c++ - 从纯虚拟(接口)类虚拟继承是一个很好的约定吗?

我经常使用纯虚拟类(接口)来减少当前项目中不同类的实现之间的依赖关系。我什至有层次结构,其中我有纯虚拟和非纯虚拟类扩展其他纯虚拟类,这对我来说并不罕见。下面是这种情况的一个例子:

两者兼而有之RunnableEngine,使钻石问题不受影响。RenderingEngineEngineSimpleOpenGLRenderingEngine

我想对钻石问题采取预防性立场,而不是在它成为问题时处理它,特别是因为我喜欢编写尽可能容易让其他人使用的代码,我不希望他们不得不修改我的类,以便他们可以创建特定的类层次结构,例如,如果 Bob 想这样做:

如果我没有进行虚拟SimpleOpenGLRenderingEngine扩展,这是不可能的。我知道 Bob 想要这样做的可能性可能非常低。RenderingEngine

所以,我已经开始使用总是虚拟地扩展纯虚拟类的约定,这样它们的多重继承就不会导致菱形问题。也许这是因为我来自 Java 并且倾向于只对非纯虚拟类使用单继承。我敢肯定在某些情况下这可能是矫枉过正,但使用这种约定有什么缺点吗?这会导致性能/功能等问题吗?如果不是,我看不出有理由不使用该约定,即使最终可能通常不需要它。

0 投票
2 回答
1208 浏览

c++ - 如何扩展/组合包含纯虚函数的接口类?

我在用:

但是当我尝试通过将指针传递给回调/事件来连接到这些接口时,ISearchFuncs无法运行。然而,在实际实现它们的类中使用这些接口进行连接没有这样的问题。我可以忍受这一点,但如果我能深入了解这个问题,那将是更好的封装。

这是如何使它工作的:

而传递给另一个类以执行等效操作无法在运行时连接事件:

调用:

抱歉代码重复,但这让我发疯。

我试图遵循的成语是bada SDK's help 的一部分

0 投票
1 回答
94 浏览

c++ - 通过模板或纯虚拟基类继承动态类型文件访问?

我想访问一个包含各种类型的键->值对的文件(例如,目前只有,但将来double可能会出现)。long double文件访问可能发生在键之间,此时将进行一些(相当复杂的)插值。访问速度非常重要。

我看到了两种实现这一点的方法:

  1. 使用模板为此类文件编写通用阅读器,使用键和值类型作为模板参数。这将非常快速且易于实现,但是,它需要人们在打开文件时知道文件中的类型。
    要在不知道确切类型的情况下打开文件,我需要实现一个包装器来打开各种类型的文件并转换类型,这意味着每次访问文件时都会进行一些转换。
    缺点是这个包装器会非常丑陋和庞大,因为它必须为每种可能的类型组合包含一个特殊情况。我可能会为这个包装器自动生成代码或使用一些预处理器魔法。
  2. 从计算机科学的角度来看,将键和值类型包装到具有公共抽象基类的类中并始终处理指向这些类的指针会更好。
    这将使未知类型文件的使用变得更加容易,尽管它始终涉及动态转换。
    问题是前面提到的插值将需要构建大量的这些包装类以及大量的虚函数调用,这可能会对访问速度产生显着的负面影响。
    我也犹豫是否要添加这种没人会使用的灵活性(毕竟,double这是现在唯一需要的东西)。

你会怎么做?你有更好的建议吗?

0 投票
2 回答
3167 浏览

c++ - C++ 覆盖最终和纯虚方法

考虑一个类,它应该为其所有子类提供一些(多态)方法,例如算术或按位运算符。这些操作不应被派生类修改以确保正确执行。但是,与此同时,我希望单独定义子类的评估(在我的示例中使用函数 isError() ):

鉴于当前的标准,这似乎是不允许的,因为“纯虚拟性”意味着子类必须实现基类的所有虚拟功能,而“final”关键字与这种范式相矛盾。

任何建议或想法如何处理这种矛盾?

0 投票
2 回答
6897 浏览

c++ - 私有和受保护的纯虚函数之间有什么区别吗?

我可以理解,可能有理由将已实现的(而不是纯的)虚函数声明为私有或受保护的。Afaik,如果您将实现的虚拟方法声明为受保护,您的子类可以调用基类的方法(而其他人不能)。如果将其声明为私有,则只有基类可以调用虚拟方法的默认实现。

但是,对于纯虚拟,没有基本实现......那么将纯虚拟声明为私有或受保护在功能上不等效吗?受保护的纯虚拟没有意义,因为您永远无法调用基类的相应方法。受保护的纯虚拟是否有任何意义?

SO上有一些类似的主题,但我找不到任何可以简明扼要地回答我的问题的东西。