ab.com コミュニティ https://www.activebasic.com/forum/ |
|
オブジェクトを値で渡した時の不具合 https://www.activebasic.com/forum/viewtopic.php?t=1523 |
ページ 1 / 1 |
作成者: | k.kiyo [ 2006年9月06日(水) 21:15 ] |
記事の件名: | オブジェクトを値で渡した時の不具合 |
Ver5cp2で「実体オブジェクトを値参照パラメータとして引き渡せるようになりました」 ということで試してみました。 コード: class Foo public sub prt() print "prt";m_n end sub sub operator =(byref f as Foo) m_n = f.m_n print "operator=";m_n end sub sub Foo(byref f as Foo) m_n = f.m_n print "copy Foo";m_n end sub sub Foo() m_n = -1 print "default Foo";m_n end sub sub Foo(n as long) m_n = n print "arg Foo";m_n end sub sub ~Foo() ' print "~Foo";m_n 'アクセス違反 end sub m_n as long end class sub test(obj as Foo) ' obj.prt() 'アクセス違反 endsub dim f as Foo(10) test(f) 結果: arg Foo 10 arg Foo 3941088 operator= 10test関数の実引数objがメンバ変数にアクセスするとアクセス違反になります。 デストラクタでもメンバ変数にアクセスするとアクセス違反になります。 objの構築ですが、デフォルトコンストラクタが呼び出されず、 引数をとるコンストラクタが呼び出されます。 しかも引数の値が不定値です。 あと、バグではないですが、実体オブジェクトを値で渡す場合、 現状ではコンストラクタ呼び出しの後operator=が呼ばれるようになってると思いますが、 コピーコンストラクタを1回呼ぶほうが効率がいいと思います。 |
作成者: | 山本 [ 2006年9月07日(木) 14:11 ] |
記事の件名: | |
ご報告ありがとうございます。コンストラクタのオーバーロードが正常に解決できない問題、こちらでも確認できましたので次回のバージョンアップで修正させていただきます。 実体オブジェクトの値参照パラメータ引渡し時のコピーコンストラクタ呼び出しについてですが、こちらも次回のバージョンで対応しようと思います。引渡し時の動作ケースの優先度としては下記のような順位を考えています(上のほうを優先)。 1. コピーコンストラクタを呼び出す 2. 一般コンストラクタ(引数なし)を呼び出し、オーバーロードされた=演算子を呼び出す 3. 実体オブジェクトをダイレクトコピー(構造体は常にコレ) |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |