来到具有 Java 背景的 C++ 时,我想通过使用两种实现方式之一初始化 A
类型的变量来设置一些多态代码,B
或C
。
我的问题是是否有一种简单的方法在堆栈上执行此操作。我有一个案例,我只在方法体内使用 A
,并且希望它在函数结束时销毁,因此触摸堆是可选的。
下面是我在堆上的做法:
A* a = NULL;
if (p) {
B* b = new B();
b->setSomethingImplementationSpecific();
a = b;
}
else {
a = new C();
}
doSomething(a);
delete(a);
在实践中,我可能会将其提取到工厂方法中,并使用 auto_ptr
来避免 delete(a)
。
这行得通,但我可以在堆栈上做吗?我的思维模式是这样的:
A* a = NULL;
if (p) {
B b;
b.setSomethingImplementationSpecific();
a = &b;
}
else {
C c;
a = &c;
}
doSomething(a);
现在我不必为 delete(a)
操心,但是 doSomething(a)
将不起作用,因为 B
或 C
在超出范围时被销毁。
我也一直在尝试找出一种方法来使用三元运算符来完成它的一部分,但我最终既搞砸了语法又获取了临时地址——所以我是对的没有办法做到这一点?
A * const a = &(p ? B() : C());
欢迎就首先在堆栈上实现多态性是否是一个愚蠢的想法提出建议,但主要是我试图更好地理解 C/C++ 在这个领域的限制,独立于设计意义。
最佳答案
如果您使用的是 C++11,则可以使用 unique_ptr
获得“堆栈语义” :
std::unique_ptr<A> a = (p ? new B() : new C());
虽然对象本身仍然会分配在堆上。
std::auto_ptr<A>
是 C++03 中的等效习语。
关于c++ - 在堆栈上初始化多态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049166/