29

C++ では、publicオブジェクトが表示されている場所ならどこからでもアクセスできるメンバーをprivate意味し、同じクラスの他のメンバー内またはそのフレンドからのみメンバーにアクセスできることを意味します。

しかし、Qt では、 と の違いはprivate slots存在public slotsしないようです。私は最近 Qt を書き始め、ずっと使っprivate slotsていました。

public slots代わりに使うべきだと誰かが私に言った。だから今、私は困惑しています。Qt のドキュメントで参照情報が見つかりません。

2つのタイプの実際の違いは何ですか?

4

3 に答える 3

36

Qtドキュメントから:

スロットは通常のメンバー関数であるため、直接呼び出された場合は通常の C++ 規則に従います。ただし、スロットとして、シグナルスロット接続を介して、アクセスレベルに関係なく、任意のコンポーネントから呼び出すことができます。これは、任意のクラスのインスタンスから発行されたシグナルによって、関連のないクラスのインスタンスでプライベート スロットが呼び出される可能性があることを意味します。

これが意味すること:別のクラスからプライベート スロットを関数として呼び出すことはできませんが、そのプライベート スロットに接続されたシグナルを発行する場合は、それを呼び出すことができます。

于 2013-06-09T18:19:51.127 に答える
5

@ user2448027の回答は正しいですが、 private slotsQtの設計パターンには欠けている点がありますpublic slots

スロットprivateを作成すると、オブジェクトのユーザーは、メンバー アクセス演算子 (または)connectではなく、関数を使用してスロットを呼び出すようになります。.->

クラスのスロットの 1 つに遅いコードまたはブロック コードがあるとします。クラスのユーザーが作成されたオブジェクトを別のスレッドに移動することを期待しているため、このオブジェクト (GUI または GUI に関連するオブジェクト) の所有者は、このスロットを呼び出してフリーズまたはブロックしません。ポイントは次のとおりです。スロットが.or->演算子によって直接呼び出された場合、スロットはブロックされます。呼び出し元メソッドの現在のスレッドがスロットを使用するため、パブリック スロットを使用する場合にのみ発生する可能性があります。解決策はスロットを作成することですprivate。そのため、ユーザーはそれを でのみ呼び出すことができconnect、メンバー アクセス演算子(.または->) では呼び出すことができません。

結論:

  • ブロッキング スロットがある場合は、それらを にしますprivate
  • オブジェクトプロパティの簡易設定としてスロットを使用する場合は、スロットを にしますpublic
  • 戻り値または不定の参照引数を持つメソッドが必要な場合は、それらをスロットにしないでください (ナンセンスです)。それだけpublicで十分です。
于 2016-08-04T21:05:09.703 に答える