7

これはばかげた質問かもしれませんが、私はこれを考えすぎていますが、次のような状況があります。抽象的な「クラス アクション」オブジェクトを実行できる「クラス シェル」を作成しています。これらのオブジェクトを作成または使用する必要がある唯一のクラスです。アクション オブジェクトは、特定のアクションを実行するためにシェルにアクセスする必要がありますが、このためにパブリック インターフェイスを追加することは避けようとしています (他の誰もそれを許可されるべきではありません)。

私はもともとシンプルでした(それほどエレガントではありません)

class Shell
{
 public:
    bool checkThing();
    // etc...
 private:
    bool _thing;
};

class Action
{
 public:
    virtual void execute( Shell &s )=0;
};

class ChangeAction : public Action
{
 public:
    void execute( Shell &s )
    {
        // requires friendship or public mutator!
        s._thing = true;
    }
};

そこで、ネストされたクラス Action を検討しましたが、それを非公開にしたかったのです (シェル以外の具体的な Action を作成できるようにするのはなぜでしょうか?)

class Shell
{
 public:
    bool checkThing();
    // etc...
 private:
    bool _thing;
    class Action;
};

class Shell::Action
{
 public:
    virtual void execute( Shell &s )=0;
};

class ChangeAction : public Shell::Action
{
 public:
    void execute( Shell &s )
    {
        // ok now!
        s._thing = true;
    }
};

しかしもちろん、これ以上 Action から継承することはできません (これは理にかなっており、非公開です)。だからうまくいかない。

私の質問は、最初の方法と友情、またはパブリックインターフェイスを使用する必要がありますか? アクションおよびシェルとの関係を維持するために、2 番目の方法に似た方法を使用できますか? もっと良いアイデアはありますか?

4

2 に答える 2

4

表示できる必要がある唯一のコードが の場合、1 つのオプションActionは、ヘッダー ファイルでShell前方宣言Actionし、.cpp ファイルでクラスを定義するだけです。Actionこれにより、実装ファイルで必要な数のサブクラスを宣言できます。他のAction誰もAction. これにより、パブリック インターフェイスやfriend宣言が不要になります。すべてのActionクラスはグローバル スコープで宣言されますが、.cpp ファイルで宣言されているため、他のファイルからは保護されます。

ところで、素晴らしい質問です。

于 2011-02-16T07:08:56.210 に答える
0

メソッドを組み合わせて使用​​できます。基本的には、最初のメソッドからすべてのクラスを取得し、それらをShellクラスのプライベートセクションに移動します。

class Shell {
public:
    bool checkThing();     // etc...
private:
    bool _thing;

    class Action {
    public:
        virtual void execute( Shell &s )=0;
    };

    class ChangeAction : public Action
    {
    public:
        void execute( Shell &s )
        {
            // ok now!         s._thing = true;
        }
    }; 

};
于 2011-02-16T07:11:22.503 に答える