21

これはconst-refで決して得られないことです。誰かが私に説明できることを本当に願っています。Qtで信号を送信するときのconst-ref

別の関数の中で関数を呼び出すと、私が改ざんするつもりがないスタックオブジェクトを渡すときに、そのconst-refが最良の方法です。例:

void someInnerFunction(const QString& text) { 
    qDebug() << text; 
} 

void someFunction() { 
    QString test = "lala"; 
    .... 
    someInnerFunction(test); 
} 

これまでのところ、とても良いと思います。しかし、シグナルはどうですか?参照を渡すことに伴うリスクはありませんか?たとえそれがconstであっても。私はconst-refに関するすべてのドキュメントを読んでいるように感じていますが、私は「オブジェクトへの参照を送信してそれを維持する」と理解しているため、少し危険です。それが参照しているオブジェクトが範囲外になるとどうなりますか?例えば

void someFunction() { 
    connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&))); 

    QString test = "lala"; 
    emit someSignal(test); 

    // doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied. 
} 

void someSlot(const QString& test) { 
    qDebug() << test; // will this work? 
} 

は本当にここで何が起こっているの?私は頻繁にオブジェクトにアクセスしたいがそれを変更したくない関数呼び出しに対してconst-refを使う。しかし、シグナルはどうですか?ほとんどのシグナルはQtのdocでconst-ref parmを持っているようですが、どのように機能しますか?

+0

*「別の関数の内部関数を呼び出すときに、私はオブジェクトを渡すときのconst refは最良の方法であることを取得します。」*それはです基本的なC++の問題に対する答えはどれもきわめて大きかったのですが、それはあなたに言ったのですか? – HostileFork

+0

あなたがそれらを変更する予定がないならば、私は意味します。ちょうどqtがどこでもどこでも使えるように思えますが、私はどこにでも行っていません。しかしそれがうまくいかないときは?私はそれらを関数にコピーしたくないスタックオブジェクトについて話しています – chikuba

+0

基本的には、スタックオブジェクトをイン・パームとして渡さなければならないときに、以下の議論が交渉中であると考えました。 http://stackoverflow.com/questions/270408/is-it-better-in-c-to-pass-by-value-or-pass-by-constant-referenceしかし、私の質問はシグナルとは何か私たちはオブジェクトをコピーする必要がないようにconst-refで処理する必要があります。 – chikuba

答えて

17

this answerによれば、Qtはconst参照をコピーに置き換えます。

編集:明らかに常にそうとは限りません...私はちょうど1つのスレッドで基本テストプログラムを実行し、参照が正しく渡されました。そのコンステネスもそのまま残っていました。とにかく、はい、範囲外になる変数に注意する必要があります。また、この方法でスレッド間で参照を送信することはできません。そうした場合、コピーのみが渡されます。

例のコメントにある質問に答えるには、はい、直接接続か待機中の接続かに関係なく機能します。それが直接接続の場合は、someFunction()が終了する前にsomeSlot()が実行されるために動作します。キューに入れられた接続の場合は、testが参照渡しではなくコピーされるために機能します。

+6

どこを読んだのですか?私が見たのは「直接接続の場合は、不要なコピーを避けるために値をconst参照渡しにすることをお勧めします」Qtは引数の受け渡しにかかわらずコピーを作成する " – chikuba

+0

@chikuba編集を参照してください。 – Anthony

+1

"とにかく、範囲外の変数には注意が必要です。ポインタを介してオブジェクトを渡さない限り、問題がどこにあるかわかりません。 –

0

Qtでは、1つまたは複数のスロットに接続されている信号を放射するとき、それは同期関数呼び出しと同じです...信号とスロットがキューに入れられた接続を使用するように設定していない限り、スタックデータを渡すときは注意が必要です。データを別のスレッドに渡すようにコピーを渡す必要があります。ここで

+2

const refsで渡されたオブジェクトは、非同期(キューに入れられた)接続のためにコピーされます。スタックデータがポインタで渡されない限り、スコープから外れることはありません。 –

+0

「ポインタで渡す」とはどういう意味ですか? – chikuba

関連する問題