簡體   English   中英

設計頭痛與unique_ptr

[英]design headache with unique_ptr

假設我們有Foo課:

class Foo {
public:
  ...
};

Foo有一個實例方法,它可以將Foo實例轉換為另一個Foo實例,或者返回相同的Foo實例:

<some appropriate pointer type to Foo> Foo::tryToTransform() {
  if (canBeTransformed()) {
    <delete this Foo instance>;
    return <new instance of Foo>;
  }
  else {
    return <this instance of Foo>;
  }
}

客戶代碼:

<some appropriate pointer type to Foo> foo = ...;
...
foo = foo->tryToTransform();

使用裸指針很容易做到這一點:

Foo* Foo::tryToTransform() {
  if (canBeTransformed()) {
    delete this;
    return new Foo(...);
  }
  else {
    return this;
  }
}

Foo* foo = ...;
...
foo = foo->tryToTransform();

但是如果客戶端代碼使用unique_ptr而不是裸指針呢? 也就是說,理想情況下我希望客戶端代碼看起來像這樣:

unique_ptr<Foo> foo = ...;
...
foo = foo->tryToTransform();

如何定義Foo::tryToTransform()以啟用此類(或類似)客戶端代碼?

由於tryToTransform函數是成員函數 ,因此調用者保留unique_ptr所有權。 因此,從成員函數中刪除調用者的unique_ptr不可能的 (沒有骯臟的技巧)。

因此,您需要一個獲取unique_ptr所有權的靜態函數:

class Foo {
    static unique_ptr<Foo> tryToTransform(unique_ptr<Foo> ptr) {
        if(...) {
            return unique_ptr<Foo>(new Foo()); // old ptr is destroyed
        } else {
            return ptr;
    }
};

打電話給

unique_ptr<Foo> foo = ...;
...
foo = Foo::tryToTransform(move(foo));

這可以通過讓tryToTransform獲得unique_ptr所有權來實現。 然后它可以按照自己的意願銷毀指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM