Вы можете реализовать решение с помощью shared_ptr и weak_ptr, как подсказывает eerorika, выполнив что-то подобное. Вы можете предпочесть это решение уникальному_ptr, если не хотите, чтобы Фабрика была владельцем объектов, определяющих , когда вещи недопустимы.
Ваш класс фабрики может выглядеть примерно так:
class Factory {
public:
std::shared_ptr<MyObject> create();
std::vector<std::weak_ptr<MyObject>>& getObjects();
private:
std::vector<std::weak_ptr<MyObject>> objects;
void cullInvalidObjects();
};
Мы просто создаем слабый_птр из shared_ptr объекта в методе фабрики:
std::shared_ptr<MyObject> Factory::create()
{
auto object = std::make_shared<MyObject>();
std::weak_ptr<MyObject> weakObject = object;
objects.push_back(weakObject);
return object;
};
Фабрика может иметь внутренний метод, который отбирает недопустимые объекты:
void Factory::cullInvalidObjects()
{
auto iter = objects.begin();
while (iter != objects.end())
{
if ((*iter).expired())
{
objects.erase(iter++);
}
}
}
и затем, когда вы заставляете объекты работать с ними, вы, вероятно, захотите отбросить список, прежде чем предоставлять его:
std::vector<std::weak_ptr<MyObject>>& Factory::getObjects()
{
cullInvalidObjects()
return objects;
}
В качестве альтернативы, вместо отбраковки, вы можете просто получить список, а затем проверьте правильность ваших функций, которые его обрабатывают. Возможно, это не лучшее решение, если у вас большое количество недопустимых предметов.
void callSomeMethod(std::vector<std::weak_ptr<MyObject>>& objects)
{
for (auto wObj : objects)
{
auto sObj = wObj.lock();
if(p)
{
p->someMethod();
}
}
}