ページ 1 / 1
デストラクタが呼び出せない
Posted: 2006年5月03日(水) 03:37
by k.kiyo
デストラクタを呼ぼうとすると文法エラーになります
コード: 全て選択
class Foo
public
sub Foo()
print "コンストラクタ"
endsub
sub ~Foo()
print "デストラクタ"
endsub
endclass
dim pobj as *Foo
dim size=10 as long
dim i as long
pobj = malloc(sizeof(Foo)*size)
for i=0 to ELM(size)
pobj.Foo()
next
for i=0 to ELM(size)
pobj.~Foo()'文法が間違っています
next
free(pobj)
Re: デストラクタが呼び出せない
Posted: 2006年5月03日(水) 13:29
by 7
> デストラクタを呼ぼうとすると文法エラーになります
>
>
コード: 全て選択
class Foo
> public
> sub Foo()
> print "コンストラクタ"
> endsub
> sub ~Foo()
> print "デストラクタ"
> endsub
> endclass
>
> dim pobj as *Foo
> dim size=10 as long
> dim i as long
>
> pobj = malloc(sizeof(Foo)*size)
> for i=0 to ELM(size)
> pobj.Foo()
> next
>
> for i=0 to ELM(size)
> pobj.~Foo()'文法が間違っています
> next
> free(pobj)
malloc関数ではコンストラクタは実行されませんし、free関数ではデストラクタは実行されません。
New演算子とDelete演算子を使うべきです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
class Foo
public
sub Foo()
print "コンストラクタ"
endsub
sub ~Foo()
print "デストラクタ"
endsub
endclass
dim pobj as *Foo
dim size=10 as long
dim i as long
pobj = new [size] Foo
for i=0 to ELM(size)
pobj.Foo()
next
delete pobj
肝心のデストラクタは・・・
Posted: 2006年5月03日(水) 13:43
by OverTaker
Newを使っても、デストラクタを任意で呼ぼうとすると、なぜか文法エラーになりますね。
普通デストラクタは任意で使わないと思いますが・・・
コード: 全て選択
#console
class Foo
public
sub Foo()
print "コンストラクタ"
endsub
sub ~Foo()
print "デストラクタ"
endsub
endclass
dim pobj as *Foo
dim size=10 as long
dim i as long
pobj = new [size] Foo
for i=0 to ELM(size)
pobj.Foo()
next
pobj.~Foo() 'デストラクタで文法エラー
delete pobj
Posted: 2006年5月03日(水) 18:20
by k.kiyo
固定長の配列ならnew、deleteを使えばいいと思うんですけど、
vectorのような可変長の配列を作りたいので、どうしてもデストラクタを呼び出す必要があるんです。
Posted: 2006年5月03日(水) 22:59
by みどるべあ
そういう場合はコンストラクタ、デストラクタを使わずに、
Foo_create,Foo_destroyとか別の関数としておけばいいのでは?
とクラスを使ったことのない人が言ってみる。
Posted: 2006年5月04日(木) 00:16
by イグトランス
個人的にはコンストラクタを呼べたのが意外でした。
C++では逆にデストラクタは呼べますが,(メンバ関数呼び出しの構文で)コンストラクタは呼べませんので。
> 7さん
malloc/freeではコンストラクタ・デストラクタが呼ばれないからこそ,
敢えて自分でコンストラクタ・デストラクタを呼ぼうという試みだと思います。
> みどるべあさん
特定のクラス限定であればそれでよいのですが,
どんなクラスにも対応するにはやはりコンストラクタ・デストラクタを呼べるのがよいです。
とは言ってもどんなクラスにも対応する方法が今のABには無いですけどね。