87 lines
1.1 KiB
C
87 lines
1.1 KiB
C
// { dg-do run }
|
|
// 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;
|
|
}
|