gpt4 book ai didi

c++ - 向抽象类的 std::vector 添加元素

转载 作者:可可西里 更新时间:2023-11-01 17:31:08 29 4
gpt4 key购买 nike

我想将从公共(public)接口(interface)(抽象类)派生的类的对象存储在该抽象类的 std::vector 中。这个 vector 应该在一个循环中填充,通常我会调用一个类的构造函数并将创建的对象推送到 vector 中。

据我所知,在抽象类的情况下,我只能存储指向该类的指针,因此我需要 push_back 派生类的指针。但是,我不确定这些新创建的对象的范围。

请看下面的代码。这段代码可以编译并运行良好,但我的问题是:

a) 对象是否保证存在于主函数的第二个 for 循环中?或者它们可能会在创建它们的循环范围之外停止存在?

b) 是否调用了所有对象的析构函数或可能存在内存泄漏?

#include<vector>
#include<iostream>
class Interface {
public:
Interface( int y ) : x(y) {}
virtual ~Interface() {}
virtual void f() = 0;
int x;
};

class Derived_A : public Interface {
public:
Derived_A( int y ) : Interface(y) {}
void f(){ return; }
};

class Derived_B : public Interface {
public:
Derived_B( int y ) : Interface(y) {}
void f(){ return; }
};


int main()
{
std::vector<Interface*> abstractObjects;
int N = 5;
for(int ii = 0; ii < N; ii++ )
{
abstractObjects.push_back( new Derived_A(ii) );
abstractObjects.push_back( new Derived_B(ii) );
}

for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
abstractObjects[ii]->f();
std::cout << abstractObjects[ii]->x << '\t' << std::endl;
}


for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
delete abstractObjects[ii];
}

return 0;
}

最佳答案

这是智能指针的完美案例。您可以将指针存储在 unique_ptr 中这是一种 RAII 类型。当 unique_ptr 超出范围时,它会自动为您删除内存。

    //...
std::vector<std::unique_ptr<Interface>> abstractObjects;
int N = 5;
for(int ii = 0; ii < N; ii++ )
{
abstractObjects.push_back( std::make_unique<Derived_A>(ii) );
abstractObjects.push_back( std::make_unique<Derived_B>(ii) );
}

for(auto & e : abstractObjects) // ranged based for loop
{
e->f();
std::cout << e->x << '\t' << std::endl;
}
// no need to do anything here. the vector will get rid of each unique_ptr and each unique_ptr will delete each pointer
return 0;
}

关于c++ - 向抽象类的 std::vector 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410858/

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