1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <stdio.h> struct NodeImpl { NodeImpl *next; void *data; public: // we have pointers, so fulfill the rule of three NodeImpl() : next(NULL), data(NULL) {} ~NodeImpl() {} NodeImpl& operator=(const NodeImpl& b) {next = b.next; data = b.data; return *this;} // This function now a member. Also, I defined it. void* getLastItem() { if (next) return next->getLastItem(); return data; } void* getData() {return data;} void setData(void* d) {data = d;} }; // the template _inherits_ from the impl template <typename T> struct Node : public NodeImpl { Node<T> operator=(const Node<T>& b) {NodeImpl::operator=(b);} // we "redefine" the members, but they're really just wrappers T* getLastItem() { return static_cast<T*>(NodeImpl::getLastItem());} T* getData() {return static_cast<T*>(NodeImpl::getData());} void setData(T* d) {NodeImpl::setData(static_cast<void*>(d));} //or, if you prefer directness... operator T*() {return static_cast<T*>(NodeImpl::getData());} Node<T> operator=(T* d) {NodeImpl::setData(static_cast<void*>(d));} }; struct A { }; struct B { }; int main() { Node<A> as; //why were these heap allocated? The root can be on the stack A *a = as.getLastItem(); Node<B> bs; //also, we want a each node to point to a B, not a B* B *b = bs.getLastItem(); B* newB = new B; bs = newB; //set the data member newB = bs; //read the data member } |
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgTm9kZUltcGwKewogICAgTm9kZUltcGwgKm5leHQ7CiAgICB2b2lkICpkYXRhOwpwdWJsaWM6ICAgIAogICAgLy8gd2UgaGF2ZSBwb2ludGVycywgc28gZnVsZmlsbCB0aGUgcnVsZSBvZiB0aHJlZQogICAgTm9kZUltcGwoKSA6IG5leHQoTlVMTCksIGRhdGEoTlVMTCkge30KICAgIH5Ob2RlSW1wbCgpIHt9CiAgICBOb2RlSW1wbCYgb3BlcmF0b3I9KGNvbnN0IE5vZGVJbXBsJiBiKSB7bmV4dCA9IGIubmV4dDsgZGF0YSA9IGIuZGF0YTsgcmV0dXJuICp0aGlzO30KICAgIC8vIFRoaXMgZnVuY3Rpb24gbm93IGEgbWVtYmVyLiAgQWxzbywgSSBkZWZpbmVkIGl0LgogICAgdm9pZCogZ2V0TGFzdEl0ZW0oKQogICAgewogICAgICAgIGlmIChuZXh0KQogICAgICAgICAgICByZXR1cm4gbmV4dC0+Z2V0TGFzdEl0ZW0oKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIHZvaWQqIGdldERhdGEoKSB7cmV0dXJuIGRhdGE7fQogICAgdm9pZCBzZXREYXRhKHZvaWQqIGQpIHtkYXRhID0gZDt9Cn07CgovLyB0aGUgdGVtcGxhdGUgX2luaGVyaXRzXyBmcm9tIHRoZSBpbXBsCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgTm9kZSA6IHB1YmxpYyBOb2RlSW1wbAp7CiAgICBOb2RlPFQ+IG9wZXJhdG9yPShjb25zdCBOb2RlPFQ+JiBiKSB7Tm9kZUltcGw6Om9wZXJhdG9yPShiKTt9CiAgICAvLyB3ZSAicmVkZWZpbmUiIHRoZSBtZW1iZXJzLCBidXQgdGhleSdyZSByZWFsbHkganVzdCB3cmFwcGVycwogICAgVCogZ2V0TGFzdEl0ZW0oKQogICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KE5vZGVJbXBsOjpnZXRMYXN0SXRlbSgpKTt9CgogICAgVCogZ2V0RGF0YSgpIHtyZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KE5vZGVJbXBsOjpnZXREYXRhKCkpO30KICAgIHZvaWQgc2V0RGF0YShUKiBkKSB7Tm9kZUltcGw6OnNldERhdGEoc3RhdGljX2Nhc3Q8dm9pZCo+KGQpKTt9CgogICAgLy9vciwgaWYgeW91IHByZWZlciBkaXJlY3RuZXNzLi4uCiAgICBvcGVyYXRvciBUKigpIHtyZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KE5vZGVJbXBsOjpnZXREYXRhKCkpO30KICAgIE5vZGU8VD4gb3BlcmF0b3I9KFQqIGQpIHtOb2RlSW1wbDo6c2V0RGF0YShzdGF0aWNfY2FzdDx2b2lkKj4oZCkpO30gIAp9OwoKCnN0cnVjdCBBIHsgfTsKc3RydWN0IEIgeyB9OwoKaW50IG1haW4oKQp7CiAgICBOb2RlPEE+IGFzOyAgLy93aHkgd2VyZSB0aGVzZSBoZWFwIGFsbG9jYXRlZD8gIFRoZSByb290IGNhbiBiZSBvbiB0aGUgc3RhY2sKICAgIEEgKmEgPSBhcy5nZXRMYXN0SXRlbSgpOwogICAgTm9kZTxCPiBiczsgLy9hbHNvLCB3ZSB3YW50IGEgZWFjaCBub2RlIHRvIHBvaW50IHRvIGEgQiwgbm90IGEgQioKICAgIEIgKmIgPSBicy5nZXRMYXN0SXRlbSgpOwogICAgCiAgICBCKiBuZXdCID0gbmV3IEI7CiAgICBicyA9IG5ld0I7ICAvL3NldCB0aGUgZGF0YSBtZW1iZXIKICAgIG5ld0IgPSBiczsgIC8vcmVhZCB0aGUgZGF0YSBtZW1iZXIKfQ==
-
upload with new input
-
result: Success time: 0s memory: 2956 kB returned value: 0


