?
da das ganze bei dir wohl auf ein spiel hinausläuft einige beispiele.
du hast ein spiel programmiert das heisst wie? hm... nehmen wir einfach ma starcraft 2:
class Unit
{
public:
void TOETEN(Unit *target);
private:
std::string m_name;
};
//Ja in Starcraft 2 wird das genauso gemacht!!11111111111
class UnitManager
{
public:
//...
void addUnit(Unit *u)
{
m_units.push_back(u);
};
private:
std::vector<Unit*> m_units;
};
es gibt situationen, da ist es durchaus nötig nebem dem eigentlichen zeiger, welchen man übergibt noch einen weiteren im "hauptprogramm" zu haben, da man eine einheit ja nicht nur innerhalb der verwaltungsklasse ansprechen möchte, sondern auch vom hauptprogramm aus.
class MyGame
{
public:
void hauptprogrammschleife()
{
//...
Unit *meinzergling = new Unit();
Unit *gegnerseinzergling = new Unit();
m_unitmanager.addUnit(meinzergling);
m_unitmanager.addUnit(gegnersenizergling);
//...
}
private:
UnitManager m_unitmanager;
}
du hast immernoch die möglichkeit, ausserhalb der verwaltungsklasse bzw ohne umständliches zurechtfummeln eines guten [] operators die möglichkeit, auf die objekte zuzugreifen.
//...
void hauptprogrammschleife()
{
//...
if(spieler hat auf gegnerische unit geklickt && spieler hat meinzergling angewählt)
meinzergling->TOETEN(gegnerseinzergling);
//...
}
Hierbei wäre es recht umständlich jedes mal die zerglinge per getZergling() (oder so) aus der verwaltugnsklasse zu holen.
Es gibt aber auch genügend Beispiele die aufzeigen, dass man nicht unbedingt einen "hauptprogramminternen" zeiger auf das objekt braucht.
void hauptprogrammschleife()
{
//...
m_guiverwaltungsklasse.addButton(new Button(800,600,funktionszeiger));
//...
}
Die Verwaltungsklasse hat den einzigen Zeiger auf das neue Objekt. Die Verwaltungsklasse kümmert sich später übrigens auch um das reinigen des Speichers.
Der Code oben ist natürlich in keinster Weise so genau, wie man es später umsetzen wird, aber eine Idee sollte es dir trotzdem verschaffen.
mfg TravisG