ページ 11

デストラクタが呼び出せない

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演算子を使うべきです。

肝心のデストラクタは・・・

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には無いですけどね。