#include <iostream>
#include <list>
#include <string>
#include <memory>
using namespace std;
class Animal {
public:
virtual void speak() = 0;
virtual ~Animal() {}; // Always a good thing if the class has virtual members
string name;
};
class Dog : public Animal {
public:
Dog(string n) { this->name = n; }
void speak() { cout << this->name << " says WOOF!" << endl; }
};
class AnimalQueue {
std::list<Animal*> animals;
public:
void enqueue(Animal* a) {
animals.push_back(a); // Copy the pointer
}
Animal* dequeue() {
Animal *d = animals.front();
animals.pop_front(); // Destroy the pointer
return d;
}
};
int main() {
AnimalQueue q;
std::unique_ptr<Dog> d = std::make_unique<Dog>("Rex");
q.enqueue(d.get()); // This will now store the pointer to the object
// Try with dog-specific command
Animal *sameDog = q.dequeue(); // d.get() and sameDog are now pointing at the same object
if (d.get() == sameDog)
std::cout << "d.get() == sameDog" << std::endl;
std::cout << sameDog->name << std::endl;// Prints "Rex"
sameDog->speak();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1lbW9yeT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFuaW1hbCB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBzcGVhaygpID0gMDsKICAgIHZpcnR1YWwgfkFuaW1hbCgpIHt9OyAvLyBBbHdheXMgYSBnb29kIHRoaW5nIGlmIHRoZSBjbGFzcyBoYXMgdmlydHVhbCBtZW1iZXJzCiAgICBzdHJpbmcgbmFtZTsKfTsKCmNsYXNzIERvZyA6IHB1YmxpYyBBbmltYWwgewpwdWJsaWM6CiAgICBEb2coc3RyaW5nIG4pIHsgdGhpcy0+bmFtZSA9IG47IH0KICAgIHZvaWQgc3BlYWsoKSB7IGNvdXQgPDwgdGhpcy0+bmFtZSA8PCAiIHNheXMgV09PRiEiIDw8IGVuZGw7IH0gICAgCn07CgpjbGFzcyBBbmltYWxRdWV1ZSB7CiAgICBzdGQ6Omxpc3Q8QW5pbWFsKj4gYW5pbWFsczsKcHVibGljOgogICAgdm9pZCBlbnF1ZXVlKEFuaW1hbCogYSkgewogICAgICAgIGFuaW1hbHMucHVzaF9iYWNrKGEpOyAvLyBDb3B5IHRoZSBwb2ludGVyCiAgICB9CiAgICBBbmltYWwqIGRlcXVldWUoKSB7CiAgICAgICAgQW5pbWFsICpkID0gYW5pbWFscy5mcm9udCgpOwogICAgICAgIGFuaW1hbHMucG9wX2Zyb250KCk7IC8vIERlc3Ryb3kgdGhlIHBvaW50ZXIKICAgICAgICByZXR1cm4gZDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgQW5pbWFsUXVldWUgcTsKICAgIHN0ZDo6dW5pcXVlX3B0cjxEb2c+IGQgPSBzdGQ6Om1ha2VfdW5pcXVlPERvZz4oIlJleCIpOwogICAgcS5lbnF1ZXVlKGQuZ2V0KCkpOyAvLyBUaGlzIHdpbGwgbm93IHN0b3JlIHRoZSBwb2ludGVyIHRvIHRoZSBvYmplY3QKCiAgICAvLyBUcnkgd2l0aCBkb2ctc3BlY2lmaWMgY29tbWFuZAogICAgQW5pbWFsICpzYW1lRG9nID0gcS5kZXF1ZXVlKCk7IC8vIGQuZ2V0KCkgYW5kIHNhbWVEb2cgYXJlIG5vdyBwb2ludGluZyBhdCB0aGUgc2FtZSBvYmplY3QKICAgIGlmIChkLmdldCgpID09IHNhbWVEb2cpCiAgICAJc3RkOjpjb3V0IDw8ICJkLmdldCgpID09IHNhbWVEb2ciIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBzYW1lRG9nLT5uYW1lIDw8IHN0ZDo6ZW5kbDsvLyBQcmludHMgIlJleCIKICAgIHNhbWVEb2ctPnNwZWFrKCk7CgogICAgcmV0dXJuIDA7Cn0=