0

現在のコード ベースを開発する際に、いくつかの厳密なデザイン パターンを遵守するために最善を尽くしています。これは、今後かなりの期間にわたって作業することを望んでおり、可能な限り柔軟でクリーンなものにしたいと考えているからです。ただし、これらすべての設計パターンを組み合わせて現在直面している問題を解決しようとすると、誰かが私に少しアドバイスしてくれることを望んでいるいくつかの問題に遭遇しています。

私はいくつかの一般的なクリック/ドラッグ/複製動作を提供するいくつかの基本的な自作 GUI ウィジェットに取り組んでいます。表面的には、ユーザーはウィジェットをクリックし、どこかにドラッグします。十分にドラッグすると、ウィジェットが「表示」されて自身のクローンが作成され、ユーザーはこの新しいコピーをドラッグしたままになります。

Prototype デザイン パターンは明らかに、この複製機能を多くの種類のウィジェットで一般化できるようにするために進出しています。ほとんどのオブジェクトの場合、話はそこで終わります。Prototype オブジェクトは、ユーザーが最終的にドラッグした複製バージョンの実質的に同一のコピーです。

ただし、複製したいオブジェクトの 1 つにかなり大きなリソースがアタッチされているため、ユーザーが実際にその特定のオブジェクトをクリックしてドラッグし、その後複製することを決定するまで、それらをロードしたくありません。遅延初期化に入ります。しかし、これは私にちょっとした難問を突きつけます。ユーザーがダミーのプロトタイプ バージョンを複製する前に、大きなリソースをロードする必要があるため、プロトタイプ オブジェクト自体を複製することはできません。また、クローン/複製されたときに何が起こっているかをチェックし、これらのリソースにロードするかどうかを決定するロジックをオブジェクトに入れることに熱心ではありません。代わりに、親切な人が一種のシェル オブジェクトを作成し、それがクローン化されたときに、リソースを含むこのより派生したバージョンを返して、RAII と遅延初期化の両方を使用できるようにすることを提案しました。

しかし、私はこれを実装するのに苦労しており、私が考えている方法でそれを行うことができるかどうか疑問に思っています。現在、次のようになっています。

class widgetSpawner : public widget {
public:
    widgetSpawner();
    ~widgetSpawner();

private:
    widget* mPrototypeWidget;       // Blueprint with which to spawn new elements
};

class widgetAudioShell : public widget {
public:

    widgetAudioShell(std::string pathToAudioFile);
    widgetAudioShell( const widgetAudioShell& other );
    ~widgetAudioShell();

    virtual widgetAudio* clone() const { return new widgetAudio(*this); };  

private:
    std::string mPathToAudioFile;
};


class widgetAudio : public widgetAudioShell {
public:

    widgetAudio(AudioEngineAudioTrack &aTrack);
    widgetAudio( const widgetAudio& other );
    widgetAudio( const widgetAudioShell& other );

    ~widgetAudio();

    virtual widgetAudio* clone() const { return new widgetAudio(*this); };  

private:

    AudioEngineAudioTrack &mATrack;
};

明らかに、シェルはそれを使用して新しいクラスを派生させるオブジェクトを認識していないため、これは機能しません。したがって、クローン関数を介して返すことはできません。ただし、2つの継承に関して独立したままにしておくと(両方ともウィジェットから継承するように)、コンパイラは共分散の欠如について不平を言いますが、これは理にかなっていると思いますか? あるいは、どちらか一方を適切に定義するのに再び苦労しているからかもしれません。

基本的に、widgetAudioShell は「新しい」コピーを返すことができるように、widgetAudio について知る必要があります。widgetAudio は、作成/複製時にメンバー関数を読み取ることができるように、widgetAudioShell について知る必要があります。

私が間違っていなければ、この循環依存関係は、ポインターではなく参照を使用するのが好きなためです。ポインターを使用する必要がある場合、突然、他のすべてのウィジェットで同じことを行う必要があり、非常に地獄だと思います。似たようなことに指を持っている人が知恵を提供してくれることを願っていますか?

4

0 に答える 0