c++ - 在堆栈上初始化多态变量

标签 c++ c

来到具有 Java 背景的 C++ 时,我想通过使用两种实现方式之一初始化 A 类型的变量来设置一些多态代码,BC

我的问题是是否有一种简单的方法在堆栈上执行此操作。我有一个案例,我只在方法体内使用 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) 将不起作用,因为 BC 在超出范围时被销毁。

我也一直在尝试找出一种方法来使用三元运算符来完成它的一部分,但我最终既搞砸了语法又获取了临时地址——所以我是对的没有办法做到这一点?

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/

相关文章:

c++ - 如何生成始终触发信号 SIGFPE(div by zero) 的代码?

c++ - Mongoose C++ Http 服务器只获取 MG_OPEN_FILE 事件

c - 向子进程发送数据

c - 为什么我的信号处理程序不仅等待子进程?

c - 为什么uboot的入口文件是用汇编写的?

c++ - boost 多精度 : Recursive template instantiation exceeded maximum length 256

c++ - 有没有与 C++/游戏开发人员交流的好地方?

c++ - 如果语句位于cout行中,是否有办法?

c - 跳鱼词典

c - 在字母表中向下移动一个字母?