ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:13

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - オブジェクトを値で渡した時の不具合
作成者 メッセージ
  記事の件名:   引用付きで返信する
ご報告ありがとうございます。コンストラクタのオーバーロードが正常に解決できない問題、こちらでも確認できましたので次回のバージョンアップで修正させていただきます。

実体オブジェクトの値参照パラメータ引渡し時のコピーコンストラクタ呼び出しについてですが、こちらも次回のバージョンで対応しようと思います。引渡し時の動作ケースの優先度としては下記のような順位を考えています(上のほうを優先)。

1. コピーコンストラクタを呼び出す
2. 一般コンストラクタ(引数なし)を呼び出し、オーバーロードされた=演算子を呼び出す
3. 実体オブジェクトをダイレクトコピー(構造体は常にコレ)
投稿記事 Posted: 2006年9月07日(木) 14:11
  記事の件名:  オブジェクトを値で渡した時の不具合  引用付きで返信する
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= 10
test関数の実引数objがメンバ変数にアクセスするとアクセス違反になります。
デストラクタでもメンバ変数にアクセスするとアクセス違反になります。
objの構築ですが、デフォルトコンストラクタが呼び出されず、
引数をとるコンストラクタが呼び出されます。
しかも引数の値が不定値です。
あと、バグではないですが、実体オブジェクトを値で渡す場合、
現状ではコンストラクタ呼び出しの後operator=が呼ばれるようになってると思いますが、
コピーコンストラクタを1回呼ぶほうが効率がいいと思います。
投稿記事 Posted: 2006年9月06日(水) 21:15

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean