blob: 37035bcd5918d935d85570d5241455657407d6df [file] [log] [blame]
// prms-id: 8018
class RefCount {
private:
int nref;
public:
RefCount() : nref(0) {}
~RefCount() {}
int nrefs() const { return nref; }
int reference() {
nref++;
return nref;
}
int unreference() {
nref--;
return nref;
}
};
class A : public RefCount {
public:
A() {}
~A() {}
};
class RefA {
private:
A *p;
void clear() {
if (p) {
p->unreference();
if (!p->nrefs())
delete p;
}
}
public:
RefA(A* a) : p(a) { if (p) p->reference(); }
RefA(const RefA& a) : p(a.p) { if (p) p->reference(); }
~RefA() { clear(); }
A* operator->() { return p; }
RefA& operator=(const RefA& a) {
clear();
p=a.p;
if (p)
p->reference();
return *this;
}
RefA& operator=(A* a) {
clear();
p=a;
if (p)
p->reference();
return *this;
}
};
class AccRefA {
private:
RefA a;
public:
AccRefA(A* ap) : a(ap) {}
AccRefA(const RefA& ar) : a(ar) {}
~AccRefA() {}
operator RefA&() { return a; }
RefA& result() { return a; }
};
int
main() {
RefA a1 = new A;
AccRefA aa1(a1);
RefA a3 = aa1;
if (a1->nrefs() != 3)
return 1;
}