#include <iostream>
#include <vector>
using namespace std;
class Run;
class Robot{
friend class Run; // allows the Run class to access all the private data as if it were its own
private:
int x;
public:
Robot() {};
void setX(int newX) { x= newX; }
int getX() { return x; }
void movingRobot() { x+=1; }
};
class Run{
private:
vector<Robot*> robots;
public:
Run(){};
vector<Robot*> *getRobots() { return &robots; }
void createRobot() { robots.push_back(new Robot()); robots.back()->x =1; }
void movAll() { for (int i=0;i<robots.size();i++){ robots[i]->movingRobot();} }
int getX(int robotPosition){ return robots[robotPosition]->x; } //uses the friend status to read directly from Robot class instances x
void setX(int rpos, int xval){ robots[rpos]->setX(xval); }
};
int main()
{
Run *Sim = new Run();
for (int i =0; i< 10; i++)
{
Sim->createRobot();
Sim->setX(i,i); // uses the Run setX
std::cout << "Robot " << i << "(starting position): " << Sim->getRobots()->at(i)->getX() << std::endl;
}
Sim->movAll();
// lets move Johnny 5 to 55 as well...
(Sim->getRobots()->at(4))->setX(55); // uses the robot setx
for (int i=0; i< 10; i++)
{
std::cout << "Robot " << i << "(final position): " << Sim->getRobots()->at(i)->getX()<< std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgUnVuOwoKCmNsYXNzIFJvYm90ewogICAgZnJpZW5kIGNsYXNzIFJ1bjsJLy8gYWxsb3dzIHRoZSBSdW4gY2xhc3MgdG8gYWNjZXNzIGFsbCB0aGUgcHJpdmF0ZSBkYXRhIGFzIGlmIGl0IHdlcmUgaXRzIG93bgoJcHJpdmF0ZToKCQlpbnQgeDsKCXB1YmxpYzoKCQlSb2JvdCgpIHt9OwoJCXZvaWQgc2V0WChpbnQgbmV3WCkJeyAJeD0gbmV3WDsJfQoJCWludCBnZXRYKCkgCQkJewlyZXR1cm4geDsJfQoJCXZvaWQgbW92aW5nUm9ib3QoKQl7CXgrPTE7CX0KCQp9OwoJCmNsYXNzIFJ1bnsKcHJpdmF0ZToKCXZlY3RvcjxSb2JvdCo+IHJvYm90czsKcHVibGljOgoJUnVuKCl7fTsKCXZlY3RvcjxSb2JvdCo+ICpnZXRSb2JvdHMoKQl7CXJldHVybiAmcm9ib3RzOwl9Cgl2b2lkIGNyZWF0ZVJvYm90KCkJCQl7IAlyb2JvdHMucHVzaF9iYWNrKG5ldyBSb2JvdCgpKTsgcm9ib3RzLmJhY2soKS0+eCA9MTsJfQoJdm9pZCBtb3ZBbGwoKQkJCQl7CWZvciAoaW50IGk9MDtpPHJvYm90cy5zaXplKCk7aSsrKXsgcm9ib3RzW2ldLT5tb3ZpbmdSb2JvdCgpO30JfQoJaW50IGdldFgoaW50IHJvYm90UG9zaXRpb24pewlyZXR1cm4gcm9ib3RzW3JvYm90UG9zaXRpb25dLT54Owl9ICAvL3VzZXMgdGhlIGZyaWVuZCBzdGF0dXMgdG8gcmVhZCBkaXJlY3RseSBmcm9tIFJvYm90IGNsYXNzIGluc3RhbmNlcyB4Cgl2b2lkIHNldFgoaW50IHJwb3MsIGludCB4dmFsKXsJcm9ib3RzW3Jwb3NdLT5zZXRYKHh2YWwpOwl9Cn07CgkKCQppbnQgbWFpbigpCnsKCVJ1biAqU2ltID0gbmV3IFJ1bigpOwogICAgZm9yIChpbnQgaSA9MDsgaTwgMTA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFNpbS0+Y3JlYXRlUm9ib3QoKTsKICAgICAgICAgICAgU2ltLT5zZXRYKGksaSk7IC8vIHVzZXMgdGhlIFJ1biBzZXRYCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiUm9ib3QgIiA8PCBpIDw8ICIoc3RhcnRpbmcgcG9zaXRpb24pOiAiIDw8IFNpbS0+Z2V0Um9ib3RzKCktPmF0KGkpLT5nZXRYKCkgPDwgc3RkOjplbmRsOwogICAgICAgIH0KCVNpbS0+bW92QWxsKCk7CiAgICAvLyBsZXRzIG1vdmUgSm9obm55IDUgdG8gNTUgYXMgd2VsbC4uLgogICAoU2ltLT5nZXRSb2JvdHMoKS0+YXQoNCkpLT5zZXRYKDU1KTsgLy8gdXNlcyB0aGUgcm9ib3Qgc2V0eAogICAgZm9yIChpbnQgaT0wOyBpPCAxMDsgaSsrKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiUm9ib3QgIiA8PCBpIDw8ICIoZmluYWwgcG9zaXRpb24pOiAiIDw8IFNpbS0+Z2V0Um9ib3RzKCktPmF0KGkpLT5nZXRYKCk8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKCQoJcmV0dXJuIDA7Cn0=