Не уверен, что понимаю, чего именно вы хотите, но ... используя C ++ 17, вы можете использовать умные указатели, как предлагает Раск.
Это может легко решить проблему владения и удаления дляvector.
Мне кажется, вам нужны общие указатели (std::shared_ptr
) для a
, b
и v
и слабый указатель (std::weak_ptr
) для c
.
Таким образом, вы можете использовать c
, если (и только если) существует хотя бы std::shared_ptr
, поддерживающий владение указателем.
Ниже приведен упрощенный пример без a
иb
, с v
, переименованным в vsp
(для «вектора общих указателей») и c
, переименованным в wp
(для «слабого указателя»).
#include <iostream>
#include <memory>
#include <vector>
class A
{
private:
int a;
public:
A (int a0) : a{a0}
{ }
int getValue ()
{return a;}
};
int main ()
{
std::vector<std::shared_ptr<A>> vsp;
vsp.emplace_back( new A{3} );
vsp.emplace_back( new A{4} );
std::weak_ptr<A> wp { vsp.front() };
std::cout << "Pointer 0: " << vsp[0] << " (" << vsp[0]->getValue() << ')'
<< std::endl;
std::cout << "Pointer 1: " << vsp[1] << " (" << vsp[1]->getValue() << ')'
<< std::endl;
if ( auto sp = wp.lock() )
std::cout << "Pointer wp: " << sp << " (" << sp->getValue() << ')'
<< std::endl;
else
std::cout << "Pointer wp: <deleted>" << std::endl;
vsp.clear();
std::cout << "Vector cleared" << std::endl;
if ( auto sp = wp.lock() )
std::cout << "Pointer wp: " << sp << " (" << sp->getValue() << ')'
<< std::endl;
else
std::cout << "Pointer wp: <deleted>" << std::endl;
}