作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在基类中实现初始化终结器。最简单的方法是为方法提供终结过程。不幸的是,它强制记住总是在最派生的构造函数的末尾调用它——这对客户来说非常糟糕。我想我可以在基类中使用RAII来达到理想的效果,并写了这样的代码:
#include <iostream>
using namespace std;
struct Base
{
Base()
{
struct Finishializer
{
~Finishializer()
{
cout << "Base::~Finishializer" << endl;
}
} finishializer;
cout << "Base::Base()" << endl;
}
~Base()
{
cout << "Base::~Base()" << endl;
}
};
struct Derived : Base
{
Derived()
{
cout << "Derived::Derived()" << endl;
}
~Derived()
{
cout << "Derived::~Derived()" << endl;
}
};
int main()
{
Derived();
}
然后我意识到构造函数的调用堆栈评估顺序是相反的。我的“Finishializer 模式”要求首先调用基础构造函数,然后在基础构造函数的末尾调用派生构造函数(作为下一个堆栈框架)。
不幸的是,C++(在我的例子中是 VS2015)以其他方式工作:它调用派生构造函数,但作为第一条指令,它调用基础构造函数(作为下一个堆栈框架)。
它导致以下输出:
Base::Base()
Base::~Finishializer
Derived::Derived()
Derived::~Derived()
Base::~Base()
而不是我梦寐以求的:
Base::Base()
Derived::Derived()
Base::~Finishializer
Derived::~Derived()
Base::~Base()
是否有充分的理由按原样评估堆栈,或者它可以像我提议的那样进行更改以实现“finishializers”?你知道一些替代模式来用当前的 C++ 实现做这样的事情吗?
最佳答案
我还没有找到一种方法来使用基类中的某些东西来完成您想做的事情。我发现唯一有用的是在最派生类的构造函数中添加代码。在你的情况下,
Derived::Derived()
{
cout << "Derived::Derived()" << endl;
Finishializer();
}
一旦您决定派生自 Derived
并希望在新派生的类中执行 Finishializer();
的代码,这将是一个令人头疼的维护问题。再说一次,我还没有遇到一种无需在最派生类中显式添加代码即可工作的设计/实现模式。
关于c++ - 如何在 C++ 中实现初始化终结器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42164250/
我是一名优秀的程序员,十分优秀!