Usuwanie elementu z kontenera vector...

0

Witam, czy jest jakaś możliwość aby usunąć element vector, który przechowuje wskazniki(shared_ptr) na obiekty klas:

class Moja_klasa
{
//kodzik
}

class Dziedziczona: public Moja_klasa
{
//kodzik
}

int main()
{
vector<shared_ptr<Moja_klasa> > Vektorek;

Vektorek.push_back(shared_ptr<Moja_klasa>(new Dziedziczona());

}

Ale moje pytanie brzmi, czy moge to zrobic, z poziomu klasy Moja_klasa - tz. czy obiekt(element Moja_klasa) moze usunąc sam siebie z kontenera Vector (Vektorek)?

Jest mi to bardzo potrzebne, a nie wiem w jaki sposob to uczynic ;)

Dzieki wielkie za pomoc

0

Ale moje pytanie brzmi, czy moge to zrobic, z poziomu klasy Moja_klasa - tz. czy obiekt(element Moja_klasa) moze usunąc sam siebie z kontenera Vector (Vektorek)?

Dopoki nie zapewnisz obiektowi trzymanemu w kontenerze dostepu do kontenera to sie nie da.

0

A w przypadku gdy w klasie Moja_klasa w konstruktorze przekaze wskaznik do mojego Vektora, to wszystko powinno być ok?
W takim przypadku jak mam to zrobić, aby ten konkretnie element (w ktorym funkcja usuwajaca zostala wywolana) zostal usuniety?

0
Mój obiekcik:
  Oznacz jako "do usunięcia":
    do usunięcia = prawda
  Jest do usunięcia?:
    zwróć do usunięcia

Usuń wszystkie elementy do usunięcia(Wektor wektor):
   Usuń każdy, który jest oznaczony jako do usunięcia
0

można to zrobić tak

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

class Manager;

class Base
{
public:
	Base(Manager* parent, int id) :
		parent_(parent), uniqueId_(id) {}

	virtual ~Base() {}

	virtual void cleanUp() = 0;

	virtual void remove() = 0;

	int getId() const { return uniqueId_; }

protected:
	Manager* parent_;

	int uniqueId_;
};

class Manager
{
	typedef std::vector<std::unique_ptr<Base>> children;
public:
	void addChild(std::unique_ptr<Base> child)
	{
		children_.push_back(std::move(child));
	}

	void deleteChild(int id)
	{
		auto it = std::find_if(std::begin(children_), std::end(children_), [id](children::value_type const& child) -> bool {
								if(child->getId() == id) {
									return true;
								} else {
									return false;
								}
							});
		children_.erase(it);
		std::cout << "Child " << id << " removed.";
	}

private:
	children children_;
};

class ChildObj : public Base
{
public:
	ChildObj(Manager* parent, int id) :
		Base(parent, id) {}

	virtual void cleanUp() override final
	{
		// clean up (for instance a database)
	}

	virtual void remove() override final
	{
		cleanUp();
		parent_->deleteChild(uniqueId_);
	}
};

int main()
{
	Manager manager;
	auto child = std::make_unique<ChildObj>(&manager, 7);
    auto* handle = child.get();
	manager.addChild(std::move(child));

	handle->remove();

	return 0;
}

http://melpon.org/wandbox/permlink/QP8OtoyLniReFHxR

ale zamiast direct calla z obiektu powinien być zawołany jakiś event do wątku klasy Manager, który usunie swojego childa;

1 użytkowników online, w tym zalogowanych: 0, gości: 1