gpt4 book ai didi

c++ - 在 C++ 中,如何返回采用纯虚拟(const ref)参数的对象?

转载 作者:行者123 更新时间:2023-11-27 23:56:45 24 4
gpt4 key购买 nike

我有一个包含抽象类实例列表的对象。

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 是抽象的,所以我将它们作为指针存储在 vector 中,并将其作为常量引用传递。我有 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 运算符)并在你的容器中释放(通过 delete 运算符)(class with vector 成员)。
  • 如果你想通过引用传递它,你需要保证对象不会被删除。或者您需要在该函数调用期间复制该对象。

在一些库中,容器接收刚刚创建的对象指针并将其保存在内部数据中并负责其删除。如果您不使用智能指针,则需要定义并记住哪个对象是指针引用的对象的主人。用指针管理对象不是简单的问题。智能指针让这一切变得更简单。

关于c++ - 在 C++ 中,如何返回采用纯虚拟(const ref)参数的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com