【发布时间】:2017-06-30 01:06:14
【问题描述】:
我有一个包含抽象类实例列表的对象。
class A { }; // abstract class
class B {
public:
void addA(const A& a) {
list_of_a_.push_back(&a);
}
private:
std::vector<const A*> list_of_a_;
};
A 是抽象的,所以我将它们作为指针存储在向量中,并将其作为 const 引用传递。我有不同的 A 子类。
然后我有一个类似工厂的函数来创建 B 并返回它。
B CreateB() {
B b;
DerivationOfA a; // subclass of abstract class A.
b.addA(a);
return b;
}
int main() {
B b = CreateB();
b.DoSomethingWithA(); // bad memory, 'a' was destroyed.
}
问题是一旦 B 从“create”函数返回,A 的实例就会在堆栈上被销毁。当我使用智能指针时也会发生同样的事情。我想避免使用常规指针来避免额外的内存管理问题。
这样做有什么诀窍,这样我就可以保留CreateB 函数,避免使用指针,但仍然能够将抽象类传递给B?我可以使用按值传递,只是 C++ 不允许对抽象类这样做。
编辑:我知道它为什么会发生,但我不确定在使用纯虚拟对象时如何绕过它。除了使用我想避免的 C 指针之外,我不确定如何避免范围问题。
编辑 2:更精确地说,纯虚拟 类 而不是 对象。
编辑 3:抽象 类而不是 纯虚拟 类以满足吹毛求疵。
【问题讨论】:
-
这与虚函数或抽象类无关,而是与您存储指向局部变量的指针有关。如果您有抽象基类,请考虑一直使用指针,然后考虑指针所有权以及如何使用智能指针管理它们。
-
没有“纯粹的虚拟对象”这样的想法。术语“纯虚拟类”可以翻译为“无法实例化的类”,即不能创建该类的对象
-
您需要
new向上DerivationOfA(或者如果您愿意,可能是make_unique或make_shared,这在内部最终将执行new等)。没有办法解决它,因为您不能保留指向局部变量的指针,并且在支持派生类的同时不能做任何类似 vector 的事情。 -
尝试移动语义?
-
纯虚函数。抽象类。
标签: c++ pointers inheritance memory pure-virtual