2015-11-06 110 views
0

假設class OwnerMember 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中的一個嗎?

+2

有一個問題提早了C中的使用逗號操作符的++。我相信我可能剛剛找到一個:':member((m-> setOwnership(this),move(m)))'我不知道這是否可行。 –

+2

設計的細節有腥味。但無論如何,你可以做基礎類的技巧。逗號事情應該可行,但可能會令讀者感到困惑/驚訝,或者您可以創建一個輔助靜態成員函數並使用':member(help(m))'。 – Hurkyl

+0

@Hurkyl是否因爲構造函數正在修改它的參數?這是爲了讓孩子需要知道他們父母的節點的動態自下而上構建的樹(或森林),但我們只想跟蹤客戶端應用程序中的根。 – Museful

回答

3

委派構造救援:

class Owner { 
public: 
    Owner(std::unique_ptr<Member> m) : Owner(m, m.get()) {} 

private: 
    Owner(unique_ptr<Member>& m, Member* ptr) : member(std::move(m)){ 
     ptr->setOwnership(this); 
    } 

protected: 
    const std::unique_ptr<const Member> member; 
}; 
+0

請注意,這樣一個'Owner'既不能被複制也不能被移動,因爲它的'member'現在是'const',非'constst'在不使用'const_cast'的情況下丟失。 – inetknght

+1

@inetknght:在OP代碼中,看起來好像類不能(默認)移動,否則成員將指向懸空的「所有者」。 – Jarod42

相關問題