- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想声明一个带有虚拟析构函数的纯抽象基类。我知道三种方法可以做到这一点,但我不知道哪种最好,也不知道为什么。
我的目标是以最佳实践 C++11 风格实现抽象基类接口(interface),并具有最佳的运行时性能。特别是,我想提供无操作析构函数的内联/消除。我还想消除与重复 vtable 相关的警告,方法是选择不生成重复 vtable 的实现,或者做出明智的决定来抑制警告。
以下是我所知道的实现抽象基类的三种方式:
选项#1
/// A.h:
class A {
public:
virtual ~A() {}
virtual int f() = 0;
};
选项 #2
/// A.h:
class A {
public:
virtual ~A();
virtual int f() = 0;
};
/// A.cpp:
A::~A() {}
选项 #3
/// A.h:
class A {
public:
virtual ~A() = default;
virtual int f() = 0;
};
这些是我唯一的选择吗?
#1、#2、#3 中的哪一个被认为是最佳实践?如果存在折衷(例如运行时与编译时性能),请描述它们。
对于选项 #1,内联析构函数是否会被内联?
我知道选项 #1 会将 vtable 放入每个翻译单元。选项 #1 在 clang 中生成 -Wweak-vtables
警告,并且包含在 gcc[1] 中的“模糊链接”类别中。选项 #3 不会生成 clang 警告——这是否意味着选项 #3 不会生成 vtable?
选项 #3 与其他选项究竟有何不同?
其他问题已经讨论了关于 clang 警告的类似问题,但我无法找到具体解决哪个选项被认为是最佳实践以及原因的问题。
最佳答案
最佳实践(至少在我负责时):
struct A {
//
// keep move semantics available - rule of 0, 3, or 5
// in this case, 5 because we defined a destructor.
//
A(const A&) = default;
A(A&&) = default;
A& operator=(const A&) = default;
A& operator=(A&&) = default;
virtual ~A() = default;
// non-polymorphic interface in terms of private polymorphic
// implementation
int f()
try
{
// possibly lock a mutex here?
// possibly some setup code, logging, bookkeeping?
return f_impl();
}
catch(const std::exception& e) {
// log the nested exception hierarchy
std::throw_with_nested(std::runtime_error(__func__));
}
private:
virtual int f_impl() = 0;
};
Why is it important in your opinion to have a try-catch block for f()? – einpoklum 16 mins ago
@einpoklum 很高兴你提出这个问题。因为如果你在每个方法和每个函数中都这样做,并抛出一个包含函数名(和任何相关参数)的嵌套异常,这意味着当你最终捕获异常时,你可以将所有嵌套异常解包到你的日志文件中或者cerr,你会得到一个完美的堆栈跟踪,正好指向问题。
展开嵌套异常的引用:
http://en.cppreference.com/w/cpp/error/throw_with_nested
doesn't that hurt performance?
不是一点点。
But it's a pain to add a function try block to every function
如果您不知道问题是如何发生或为什么发生的,并且对上下文没有任何线索,则必须尝试重现一个问题,这是一种更大的痛苦。相信我...
关于c++ - 在 C++ 中实现类似接口(interface)的纯抽象基类的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36370846/
可以抛出异常的函数可以有[pure]属性吗? 最佳答案 根据 https://msdn.microsoft.com/en-us/library/system.diagnostics.contracts
我使用的是纯 css 推送导航。它工作得很好,但是我不知道如何在单击导航链接时隐藏菜单。您必须手动单击菜单图标才能使菜单返回隐藏状态。但是,当单击链接并且站点跳转到某个部分时,我希望菜单自动滑入隐藏状
我正在尝试让纯 CSS 下拉菜单正常工作。它在很大程度上确实有效,除了其他内容似乎显示出来但我不知道为什么。 http://jsfiddle.net/uQveP/4/ 有人可以告诉我我做错了什么吗?
这个问题在这里已经有了答案: What is a "callback" in C and how are they implemented? (9 个回答) 关闭 8 年前。 我正在以这种方式实现回
我想在不使用 Javascript 或任何其他语言的情况下,使用 HTML 和 CSS 创建一个 Page Back Button。我想用纯 HTML 和 CSS 来完成。 我进行了搜索,但每次代码中
我对序言很陌生。据我所知,Pure Prolog 仅限于 Horn 子句。 这是一个非常简单的序言程序 - % student( Snr , FirstName , LastName ,
我想在加载数据时对容器使用以下加载指示器。 问题是, slider 具有固定的宽度和高度(300 像素和 300 像素),但我希望它能够动态适应容器。当我尝试添加宽度时:140px;和高度:140px
当内容超过可用宽度时,我需要启用滚动阴影。这是我试图用纯 css(没有 JS)来实现的。我遇到了很多文章,可以使用 css 多背景和背景附件来实现。如果内容是文本类型,则可以使用下面的 jsfilld
我正在编写一个上古卷轴在线插件,它由一个名为 Havok Script 的轻微修改的 Lua 5.1 引擎支持。 .这个Lua环境不允许访问os , io , package , debug模块或任何
我自己尝试过将 Arduino 库编译成他们自己的独立库并链接到 Eclipse 中的一个项目,但在此过程中遇到了一些问题。 是否有关于如何启动和运行的体面指南?我一直很难在网上找到一个真正有效的..
我在这里遇到了一些麻烦。我正在尝试使用本地存储创建一个待办事项列表,但我唯一要做的就是将列表项添加到本地存储并删除 所有项目 从本地存储中删除,但我无法从列表中删除单个 SELECTED 项目。有人可
我的问题很简单。考虑以下 CodePen .是否有可能仅使用 css 就可以获得相同的结果?换句话说,如果不使用 javascrip 如何做到这一点?非常感谢! Nachos are
我正在使用没有 jquery 的 angularjs,并尝试创建滚动事件监听器。 尝试过这种方法: $rootScope.$watch(function() { return $windo
我正在尝试使用纯 webgl 创建虚线。我知道这已经有一个问题,也许我很笨,但我不知道如何让它发挥作用。我理解这个概念,但我不知道如何在着色器中获取沿路径的距离。以前的答案有以下行: varying
我正在尝试用纯 JavaScript 制作工具提示,显示在 hover .就像 Stack Overflow 中将鼠标悬停在配置文件名称上的一个 div显示。 我尝试使用 onmouseover ,
我想要通过 AJAX 将监听器添加到新元素的想法: 例如,现在我有 hello world 我为每个 添加了一个监听器,但是当我通过 AJAX 加载新元素时,它没有监听器;我不完全确定问题是什么。
如果我错误地提出了这个问题,或者之前已经有人问过并回答过这个问题,我提前表示歉意。我的搜索发现了类似的基于 JQuery 和/或静态日期的问答,我正在寻找具有动态日期的纯 JavaScript 解决方
在 Real World Haskell, Chapter 28, Software transactional memory ,开发了一个并发的网络链接检查器。它获取网页中的所有链接,并使用 HEA
我正在尝试取消 jQuery-fy 一个聪明的 piece of code ,但有点太聪明了。 目标是simple 。将图像从桌面拖动到浏览器。 在这次 unjQueryfication 过程中,我发
如何重新创建 jQuery end() $('#id') .find('.class') .css('font',f) .end() .find('.seven') .css(b,'red') 我有什
我是一名优秀的程序员,十分优秀!