所以這裏的東西..我有一個對象是負責創建另一個不同的對象,這個創建的對象可以被銷燬或不(取決於用戶)。技巧部分是再次調用「創建者」對象,如果另一個對象沒有被刪除,這個類不能再次創建這個對象,但是如果另一個對象被刪除了,這個類需要重新創建並且循環繼續。問題與類「控制」
我試過2個解決方案: 全局變量作爲「旗」,它工作正常,但我烤全球變量使用; 第二個是使析構函數返回一個值給這個標誌,但我不能從析構函數返回。
你知道除了全局變量以外的另一種方法嗎?
真正引人注目,歡呼聲。
所以這裏的東西..我有一個對象是負責創建另一個不同的對象,這個創建的對象可以被銷燬或不(取決於用戶)。技巧部分是再次調用「創建者」對象,如果另一個對象沒有被刪除,這個類不能再次創建這個對象,但是如果另一個對象被刪除了,這個類需要重新創建並且循環繼續。問題與類「控制」
我試過2個解決方案: 全局變量作爲「旗」,它工作正常,但我烤全球變量使用; 第二個是使析構函數返回一個值給這個標誌,但我不能從析構函數返回。
你知道除了全局變量以外的另一種方法嗎?
真正引人注目,歡呼聲。
您沒有指定編程語言,所以我將假設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
。
這是C++,但我沒有看到邏輯..我不能想到在其他任何事情 要去嘗試適應這個代碼到C++。感謝兄弟,我真的很感激 – DearChild
這是什麼編程語言? – melpomene