假設class Owner
有Member member
,它還必須有const
指針指向它的const
所有者。該指針被賦予member
,Owner
的構造函數,該構造函數接受一個指向組成部分member
的指針作爲參數。修改unique_ptr的目標,並使用它初始化一個常量unique_ptr
考慮Owner
的構造:
using namespace std;
class Owner;
class Member {
friend class Owner;
private:
// this object needs to know its owner for whatever reason
void setOwnership(const Owner* o){
if(owner != nullptr){
throw logic_error("Already owned.");
}
owner = o;
}
const Owner* owner;
};
class Owner {
public:
Owner(Member* m)
: member(move(m))
{
m->setOwnership(this);
}
// need to define copy ctor, move ctor, copy assignment, move assignment, destructor
// because we own member
protected:
const Member* const member;
};
現在我想unique_ptr
處理member
的所有權給我,所以我儘量
class Owner {
public:
// ATTEMPT 1
Owner(unique_ptr<Member> m)
: member(move(m))
{
member->setOwnership(this); // this doesn't work because member points to a const
}
// ATTEMPT 2
Owner(unique_ptr<Member> m){
m->setOwnership(this);
member = move(m); // this doesn't work because member is const
}
protected:
const unique_ptr<const Member> member;
};
兩個企圖Owner
的構造不編譯。我該怎麼做呢?原則上似乎沒有理由爲什麼我不能做到這一點。
爲了方便使用unique_ptr
,我必須犧牲const
中的一個嗎?
有一個問題提早了C中的使用逗號操作符的++。我相信我可能剛剛找到一個:':member((m-> setOwnership(this),move(m)))'我不知道這是否可行。 –
設計的細節有腥味。但無論如何,你可以做基礎類的技巧。逗號事情應該可行,但可能會令讀者感到困惑/驚訝,或者您可以創建一個輔助靜態成員函數並使用':member(help(m))'。 – Hurkyl
@Hurkyl是否因爲構造函數正在修改它的參數?這是爲了讓孩子需要知道他們父母的節點的動態自下而上構建的樹(或森林),但我們只想跟蹤客戶端應用程序中的根。 – Museful