アプリケーションのコードを構造化する方法について一般的な質問があります。GUI に QT を使用しており、さまざまな GUI 要素をクリックすると、対応するスロット (イベント ハンドラー) が表示されます。これはすべて Main Window クラスで行われます。しかし今、どうすればより良い構造にできるか疑問に思っていました。たとえば、あるスロットがオブジェクトを作成し、別のスロット (関数) がこのオブジェクトにアクセスしたい場合、最適なソリューションは何でしょうか? オブジェクトを格納するメイン ウィンドウに変数を持つことは理想的ではないと思います。おそらく、すべての情報を保持し、誰でもアクセスできる一般的な (静的な?) クラスでしょうか?
2 に答える
誰でもアクセスできる静的クラスを作成しないでください。一般的に言えば、グローバルな状態は悪いです。
オブジェクトから発生するシグナルを特定の qobjects に認識させる必要がある場合は、明らかにそれらを接続する必要があります。オブジェクトが永久に存続する場合は、おそらく作成中のオブジェクトをメイン ウィンドウでペアレント化できますが、これには、作成時にすべての信号をこの新しいオブジェクトに接続できる必要があります。
ある時点で、さまざまな瞬間に信号を動的に接続および接続解除する必要があるオブジェクトのコレクションを保存する必要があります。一般に、オブジェクトの目的について座って考え、誰がアクセスできるかを決定する必要があります。次に、このオブジェクトの作成、参照、および破棄を管理するためのインターフェイスを作成します。次に、これらのインターフェイスの具体的な実装を作成し、必要な機能だけを他のクラスに渡します。オブジェクトが作成方法を知る必要があるが、使用する必要がない場合は、作成者をクラスに渡します。作成ではなく使用方法を知る必要がある場合は、「ユーザー」を渡します。この状況は想像を絶するほど複雑になる可能性があるため、それぞれの目的を明確に区別する適切な設計上の決定を早い段階で行う必要があります。
あなたの非常に一般的な質問で、これは私が提供できる最善のものです。
「あるスロットがオブジェクトを作成し、別のスロット (関数) がこのオブジェクトへのアクセスを求めている場合、最善の解決策は何ですか?」
これが特定のアプリケーションに適した設計であると仮定すると (大きな if !)、実行するのは簡単です。新しく作成されたインスタンスへのポインターをシグナルのパラメーターとして渡すだけです。これ以上簡単なことはありません。作成されたインスタンスの有効期間と所有権を決定する (そしてそれに固執する!) ことを確認してください。以下のコードは、新しいインスタンスを、それが作成されたオブジェクトの子にするだけです。それはあなたの特定のケースに当てはまる場合と当てはまらない場合があります。
class Class : public QObject
{
Q_OBJECT
public:
Class(QObject * parent = 0) : QObject(parent) { ... }
signals:
void madeNew(Class *);
public slots:
void creator() {
emit madeNew(new Class(this));
}
void consumer(Class * instance) {
// do something with the new instance
}
};