我想知道从函数返回指向多态对象的指针时,最好的做法是什么,例如在使用工厂时.如果我转让所有权,我应该退货boost::unique_ptr<Interface>吗?如果我不转让所有权(例如,返回对成员的引用),我应该返回什么?是否有一种替代的,非基于增强的方式,也常用?谢谢.
编辑:它应该是C++ 03兼容的,可以轻松升级到0x
编辑2:请注意我明确询问常用方法,最佳实践,而不仅仅是"一种方法".一个暗示将来对代码库进行条件搜索和替换的解决方案看起来不是一个好习惯,是吗?
编辑3:关于auto_ptr的另一点是,它被弃用了,不管它是什么,所以在界面级别宣传它的用法看起来很奇怪.然后,有人不知道会将返回的指针放入STL容器,依此类推.因此,如果您知道另一种常见的解决方案,欢迎您添加答案.
在Windows上的最新版Firefox(28.0)中,当应用缩放行为时,如本示例所示,单个鼠标滚轮事件会导致变焦变化很大:Chrome中的变化系数为~1.65 vs~1.18.
看一下源代码:
d3_behavior_zoomDelta = function() {
return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
}
Run Code Online (Sandbox Code Playgroud)
Chrome:{deltaMode:0,deltaY:-100} - > delta = 100
Firefox:{deltaMode:1,deltaY:-3} - > delta = 360
这解释了差异,但为什么会发生这种情况呢?这是Firefox还是d3.js问题?
关于C++命名空间的正确使用,我有点困惑.我很清楚他们如何帮助避免冲突(名称冲突),但是当涉及到using关键字时,它就不再清楚了.我的意思是,假设我将一部分代码放入命名空间,并创建一个类,比方说
namespace my
{
class vector { ... };
}
Run Code Online (Sandbox Code Playgroud)
当然,当我使用它时,我不想一直打字my::vector,所以我想using namespace my.但是,我最终可能需要std命名空间中的某些东西,然后我想要using namespace std同时,但这会让我回到初始名称冲突问题.
我知道有可能只"导入"我需要的功能using std::set,但在这种情况下,完全导入标准命名空间std和my命名空间似乎很自然,因为我一直都使用它们.
这是否意味着即使我使用命名空间,我仍然应该考虑为我的类型提供非常用名称?或者是using namespace一个错误,我应该总是打字my::vector?谢谢.
好吧,我应该澄清一下,这更像是一个可读性而不是打字的问题.很多::地方看起来都很奇怪.我知道这是一个品味和习惯的问题,但不过.
在C++程序中,我需要一些辅助的常量对象,这些对象将被实例化一次,最好是在程序启动时.这些对象通常在同一个翻译单元中使用,因此最简单的方法是将它们设置为静态:
static const Helper h(params);
Run Code Online (Sandbox Code Playgroud)
但是有这个静态初始化顺序问题,所以如果Helper引用其他一些静态(via params),这可能会导致UB.
另一点是我最终可能需要在几个单元之间共享此对象.如果我离开它static并放入.h文件,那将导致多个对象.我可以通过打扰extern等来避免这种情况,但这最终会引发相同的初始化顺序问题(而不是说它看起来非常C-ish).
我想过单身人士,但由于样板代码和不方便的语法(例如MySingleton::GetInstance().MyVar),这将是一种过度杀伤- 这些对象是助手,所以他们应该简化事情,而不是让他们复杂化......
相同的C++ FAQ 提到了这个选项:
Fred& x()
{
static Fred* ans = new Fred();
return *ans;
}
Run Code Online (Sandbox Code Playgroud)
这真的被使用并被认为是一件好事吗?我应该这样做,还是你会建议其他选择?谢谢.
编辑:我应该澄清为什么我真的需要帮助器:它们非常像常规常量,并且可以预先计算,但在运行时更方便.我宁愿在main之前实例化它们,因为它会自动解决多线程问题(在C++ 03中没有保护本地静态).另外,正如我所说,它们通常仅限于翻译单元,因此导出它们并在main()中初始化是没有意义的.您可以将它们视为常量,但仅在运行时已知.