2017-10-09 53 views
0

所以這裏的東西..我有一個對象是負責創建另一個不同的對象,這個創建的對象可以被銷燬或不(取決於用戶)。技巧部分是再次調用「創建者」對象,如果另一個對象沒有被刪除,這個類不能再次創建這個對象,但是如果另一個對象被刪除了,這個類需要重新創建並且循環繼續。問題與類「控制」

我試過2個解決方案: 全局變量作爲「旗」,它工作正常,但我烤全球變量使用; 第二個是使析構函數返回一個值給這個標誌,但我不能從析構函數返回。

你知道除了全局變量以外的另一種方法嗎?

真正引人注目,歡呼聲。

+0

這是什麼編程語言? – melpomene

回答

0

您沒有指定編程語言,所以我將假設Perl(使用Moo作爲OO工具包)。

這裏是一個可能實現你描述的:

use v5.14.0; 
use warnings; 

package Item { 
    use Moo; 

    has _owner => (
     is  => 'ro', 
     weak_ref => 1, 
     clearer => 1, 
    ); 

    sub detach { 
     my ($self) = @_; 
     if (my $owner = $self->_owner) { 
      $self->_clear_owner; 
      $owner->_clear_item; 
     } 
    } 

    sub BUILD { 
     my ($self) = @_; 
     say "!! constructing $self"; 
    } 

    sub DEMOLISH { 
     my ($self) = @_; 
     say "!! destroying $self"; 
    } 
} 

package Owner { 
    use Moo; 

    has item => (
     is  => 'lazy', 
     clearer => '_clear_item', 
    ); 
    sub _build_item { 
     my ($self) = @_; 
     return Item->new(_owner => $self); 
    } 
} 

my $owner = Owner->new; 
say "owner = $owner"; 
say "(1) owner->item = ", $owner->item; 
say "(2) owner->item = ", $owner->item; 
say "entering block {"; 
{ 
    my $item = $owner->item; 
    say " (3) owner->item = $item"; 
    $item->detach; 
    say " detached item = $item"; 
} 
say "} leaving block"; 
say "(4) owner->item = ", $owner->item; 
say "owner is still = $owner"; 

當我運行這段代碼,它產生以下輸出:

owner = Owner=HASH(0x23e52f8) 
!! constructing Item=HASH(0x23e4950) 
(1) owner->item = Item=HASH(0x23e4950) 
(2) owner->item = Item=HASH(0x23e4950) 
entering block { 
    (3) owner->item = Item=HASH(0x23e4950) 
    detached item = Item=HASH(0x23e4950) 
!! destroying Item=HASH(0x23e4950) 
} leaving block 
!! constructing Item=HASH(0x23eb328) 
(4) owner->item = Item=HASH(0x23eb328) 
owner is still = Owner=HASH(0x23e52f8) 
!! destroying Item=HASH(0x23eb328) 

的想法是,Owner類有一個item屬性(它存儲了Item類的一個實例)。這個屬性是懶惰的,所以它只是按需構建的(第一次使用它)。

正如您通過查看owner->item第1,2和3行所看到的那樣,不會構造任何新對象:$owner會記住它的item

但是,可以通過調用$owner->item->detach明確銷燬item。這是可能的,因爲Item的每個實例都具有(可選的)_owner屬性;即每件物品都會記住它的主人。這是一個弱引用,否則我們會有一個引用週期(所有者保持項目活着,項目保持所有者活着)。

當我們撥打$item->detach時,$item會自動從其所有者中刪除(如果它仍有一個)。然後,只要其他任何引用都不存在,它就會自動銷燬(在本例中,當局部變量$item在其塊終止時不再存在)。

$owner,已被重置爲其初始狀態,然後在下次需要時自動重新創建一個新的item

+0

這是C++,但我沒有看到邏輯..我不能想到在其他任何事情 要去嘗試適應這個代碼到C++。感謝兄弟,我真的很感激 – DearChild