最も一般的な再利用可能な参照カウント オブジェクトは、プライベート継承を使用して再利用を実装します。私はプライベート継承の大ファンではないので、これが許容できる処理方法であるかどうかに興味があります。
class ReferenceCounter {
std::size_t * referenceCount;
public:
ReferenceCounter()
: referenceCount(NULL) {};
ReferenceCounter(ReferenceCounter& other)
: referenceCount(other.referenceCount) {
if (!referenceCount) {
referenceCount = new std::size_t(1);
other.referenceCount = referenceCount;
} else {
++(*referenceCount);
}
};
ReferenceCounter& operator=(const ReferenceCounter& other) {
ReferenceCounter temp(other);
swap(temp);
return *this;
};
void swap(ReferenceCounter& other) {
std::swap(referenceCount, other.referenceCount);
};
~ReferenceCounter() {
if (referenceCount) {
if (!*referenceCount)
delete referenceCount;
else
--(*referenceCount);
}
};
operator bool() const {
return referenceCount && (*referenceCount != 0);
};
};
class SomeClientClass {
HANDLE someHandleThingy;
ReferenceCounter objectsStillActive;
public:
SomeClientClass() {
someHandleThingy = RegCreateKeyEx(...);
}
~SomeClientClass() {
if (objectsStillActive)
return;
RegCloseKey(someHandleThingy);
};
};
または、私が見ていないこれに微妙な問題がありますか?
編集
私はこの特定の実装にあまり関心がありません(おそらくバグがあります-本番コードでこのようなものを使用する前に、shared_ptrの内部を調べることに時間を費やします)-一般的には心配です再利用可能な参照カウント機能が常に構成ではなく継承を使用して実装されているように見える特定の理由があります。