ab.com コミュニティ
https://www.activebasic.com/forum/

デストラクタが呼び出せない
https://www.activebasic.com/forum/viewtopic.php?t=997
ページ 11

作成者:  k.kiyo [ 2006年5月03日(水) 03:37 ]
記事の件名:  デストラクタが呼び出せない

デストラクタを呼ぼうとすると文法エラーになります
コード:
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)

作成者:  7 [ 2006年5月03日(水) 13:29 ]
記事の件名:  Re: デストラクタが呼び出せない

> デストラクタを呼ぼうとすると文法エラーになります
>
>
コード:
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演算子を使うべきです。

作成者:  OverTaker [ 2006年5月03日(水) 13:43 ]
記事の件名:  肝心のデストラクタは・・・

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

作成者:  k.kiyo [ 2006年5月03日(水) 18:20 ]
記事の件名: 

固定長の配列ならnew、deleteを使えばいいと思うんですけど、
vectorのような可変長の配列を作りたいので、どうしてもデストラクタを呼び出す必要があるんです。

作成者:  みどるべあ [ 2006年5月03日(水) 22:59 ]
記事の件名: 

そういう場合はコンストラクタ、デストラクタを使わずに、
Foo_create,Foo_destroyとか別の関数としておけばいいのでは?

とクラスを使ったことのない人が言ってみる。

作成者:  イグトランス [ 2006年5月04日(木) 00:16 ]
記事の件名: 

個人的にはコンストラクタを呼べたのが意外でした。
C++では逆にデストラクタは呼べますが,(メンバ関数呼び出しの構文で)コンストラクタは呼べませんので。

> 7さん
malloc/freeではコンストラクタ・デストラクタが呼ばれないからこそ,
敢えて自分でコンストラクタ・デストラクタを呼ぼうという試みだと思います。

> みどるべあさん
特定のクラス限定であればそれでよいのですが,
どんなクラスにも対応するにはやはりコンストラクタ・デストラクタを呼べるのがよいです。
とは言ってもどんなクラスにも対応する方法が今のABには無いですけどね。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/