boost::intrusive_ptr
要求intrusive_ptr_add_ref
和intrusive_ptr_release
定义.为什么不提供基类来执行此操作?这里有一个例子:http://lists.boost.org/Archives/boost/2004/06/66957.php,但海报上写着"我不一定认为这是一个好主意".为什么不?
更新:我认为这个类可能被多重继承滥用的事实是不够的.从具有自己的引用计数的多个基类派生的任何类都将具有相同的问题.这些refcounts是否通过基类实现是没有区别的.
我认为多线程没有任何问题; boost::shared_ptr
提供原子引用计数,这个类也可以.
例如,如果我在标头或 cpp 中更改函数中的签名,我希望它在另一个函数中自动更改。如果我在任何一个中添加一个新函数,它都应该出现在两个中。如果我删除一个函数,它可能会注释掉另一个函数。手动复制自己的更改似乎很愚蠢。
有些人在回答类似问题时提到了http://www.lazycplusplus.com/,但似乎这是一个命令行工具,需要保存然后在特定文件上运行此外部工具。这仍然比我想象的需要更多的手动步骤;我希望在我输入时应用更改。
vsx refactoring header-files automated-refactoring visual-c++
要关闭选民,请帮助我改进问题,以便重新开启:我如何改进这个问题以便重新开放?
Herb Sutter 写道:
基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.
根据该指南,如果您有一个具有公共非虚拟析构函数的类,则该类不应该用作基类.为什么不标记它final
来强制执行?
但Sutter也写了以下内容,暗示final
不需要使用:
重新使用"决赛是罕见的" - 嗯,他们有点.我不知道很多,在标准化过程中,Bjarne反复询问它解决的问题和应该使用的模式的例子,我不记得任何突出的主要问题.
另一个相关的引用,暗示现在final
应该使用它,来自Scott Meyer的Effective C++,第7项:
如果您曾试图从标准容器或任何其他具有非虚拟析构函数的类继承,请抵制诱惑!(不幸的是,C++没有提供类似于Java的最终类或C#的密封类的派生防止机制.)
另一个数据点是标准库没有标记为"final"的类型,但其原因似乎是避免破坏代码.
这里有一个类似的问题,但不完全是重复,因为它错过了"受保护的非虚拟"选项:默认为使类为"final"或给它们一个虚拟析构函数?
请考虑以下代码:
class Base
{
public:
virtual void Foo() {}
};
class Derived : public Base
{
private:
void Foo() {}
};
void func()
{
Base* a = new Derived;
a->Foo(); //fine, calls Derived::Foo()
Derived* b = new Derived;
// b->Foo(); //error
static_cast<Base*>(b)->Foo(); //fine, calls Derived::Foo()
}
Run Code Online (Sandbox Code Playgroud)
关于此事,我听过两种不同的思想流派:
1)保持可访问性与基类相同,因为用户无论如何都可以使用static_cast来获取访问权限.
2)使功能尽可能私密.如果用户需要a-> Foo()而不是b-> Foo(),那么Derived :: Foo应该是私有的.如果需要,它总是可以公开.
是否有理由偏好其中一个?
在http://www.reddit.com/r/IAmA/comments/1nl9at/i_am_a_member_of_facebooks_hhvm_team_a_c_and_d/ccjm2qs,Andrei Alexandrescu写道:
我认为将rvalues绑定到const引用是导致rvalue引用兴登堡的一个小错误......这将是一个长期的讨论.将rvalues绑定到const并在首次引入时有意义(没有模板,很少有细微之处),但从长远来看,几乎不可能区分rvalues和被叫方左边的左值.这反过来迫使一个过于复杂的解决方案(右值引用)作为昂贵的解决方案.
如果没有选择将rvalues绑定到const引用,那么它将如何影响移动语义和完美转发?
继我的问题:检测特定虚函数的vtable偏移量(使用Visual C++):
鉴于:
struct A
{
virtual void a() {}
virtual void b() {}
virtual void c() {}
};
Run Code Online (Sandbox Code Playgroud)
如何在Visual C++中编写函数(可能是非可移植的),这样:
int x = GetVtableIndex(&A::a); //returns 0
int x = GetVtableIndex(&A::b); //returns 1
int x = GetVtableIndex(&A::c); //returns 2
Run Code Online (Sandbox Code Playgroud)
我想要这样做的原因在于链接问题.
是否可以检查特定虚函数的vtable偏移量?
为什么?我希望能够检测到无意的二进制兼容性中断(请参阅http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B,我的意思是二进制兼容性).
我知道"/ d1reportSingleClassLayout"的未记录和不支持的技术(http://blogs.msdn.com/b/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual- c-and-fixing-lnk2022.aspx),我打算使用这种技术,但是如果可能的话,我还想使用一些简单的编译时间或运行时检查.
c++ ×7
visual-c++ ×3
c++11 ×2
boost ×1
code-design ×1
dijkstra ×1
header-files ×1
refactoring ×1
shared-ptr ×1
vsx ×1
vtable ×1