C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のプロキシクラスとは?プロキシデザインパターンの仕組みと実装例

本記事では、C++におけるプロキシクラス(Proxy Class)について解説します。プロキシクラスとは、いわゆるプロキシデザインパターンを実現するためのクラスです。このパターンでは、あるオブジェクトが別のクラスのために「修正されたインターフェース」を提供します。具体的なコード例を見ながら、その仕組みを理解していきましょう。

課題:0と1だけを格納できる配列クラスを作りたい

ここでは、「バイナリ値(0または1)しか格納できない配列クラス」を作成することを目標とします。まずは素朴な第一の試みから見てみましょう。

最初のコード例

class BinArray {
    int arr[10];
    int & operator[](int i) {
        // ここに何らかのコードを記述
    }
};

このコードには値の妥当性チェックが存在しません。本来であれば、arr[1] = 98; のような不正な代入に対してエラーを報告したいところです。

しかし残念ながら、operator[] の戻り値として int& を返す設計では、これは実現できません。operator[] が受け取るのは添字(インデックス)であり、そこに代入される値そのものを検査するタイミングがないからです。

解決策:プロキシパターンによる実装

そこで登場するのがプロキシパターンです。配列要素への参照を直接返す代わりに、代入操作を横取りして検証を行う中間オブジェクト(プロキシ)を返すようにします。以下がその実装例です。

#include <iostream>
using namespace std;
class ProxyPat {
    private:
        int * my_ptr;
    public:
        ProxyPat(int& r) : my_ptr(&r) {
        }
        void operator = (int n) {
            if (n > 1) {
                throw "This is not a binary digit";
            }
            *my_ptr = n;
        }
};
class BinaryArray {
    private:
        int binArray[10];
    public:
        ProxyPat operator[](int i) {
            return ProxyPat(binArray[i]);
        }
        int item_at_pos(int i) {
            return binArray[i];
        }
};
int main() {
    BinaryArray a;
    try {
        a[0] = 1; // 例外は発生しない
        cout << a.item_at_pos(0) << endl;
    }
    catch (const char * e) {
        cout << e << endl;
    }
    try {
        a[1] = 98; // 例外が発生する
        cout << a.item_at_pos(1) << endl;
    }
    catch (const char * e) {
        cout << e << endl;
    }
}

実行結果

1
This is not a binary digit

コードのポイント解説

  • ProxyPatクラス:配列要素へのポインタを保持し、operator= をオーバーロードしています。代入される値が1より大きい場合は例外をスローし、正当なバイナリ値の場合のみ実際の要素へ書き込みます。
  • BinaryArrayクラスoperator[]int& ではなく ProxyPat オブジェクトを返す点が重要です。これにより、a[1] = 98; のような代入式は、プロキシオブジェクトの operator= 呼び出しに変換されます。
  • 動作の流れa[0] = 1; は正常に書き込まれて「1」が出力され、a[1] = 98; は値の検証に失敗して例外メッセージが出力されます。

このようにプロキシクラスを利用することで、通常の配列のような直感的な構文を保ちながら、代入時に独自のバリデーション処理を挟むことが可能になります。ビットフラグ管理や範囲チェック付きコンテナなど、さまざまな場面で応用できる強力なテクニックです。

  1. C#のArrayクラスとは?主なプロパティと使い方をわかりやすく解説

    C#のArrayクラスとは Arrayクラスは、C#におけるすべての配列の基底クラス(基本クラス)です。このクラスはSystem名前空間で定義されており、配列を操作するためのさまざまなプロパティやメソッドが用意されています。 通常、C#で配列を作成すると、その配列は暗黙的にこのArrayクラスから派生しているため、Lengthなどの便利な機能をすぐに利用できます。 Arrayクラスの主なプロパティ一覧 以下の表は、Arrayクラスで特によく使用される代表的なプロパティをまとめたものです。 番号 プロパティと説明 1 IsFixedSize 配列が固定サイズであるかどうかを示す値を取得

  2. プロキシサーバーとは?仕組みから活用方法、注意点まで徹底解説

    私たちは日々、インターネット上でプライバシーを守るためにプロキシサーバーを利用しています。しかし、「プロキシサーバーとは何か」「どのようにブラウジングに活用するのか」を正確に説明できる人は意外と少ないのではないでしょうか。 この記事では、プロキシサーバーの基本的な仕組みから、個人やビジネスでの具体的な活用例、さらには利用時の注意点まで、わかりやすく解説していきます。 プロキシサーバーとは何か? プロキシサーバーとは、あなたとWebサイトの間に立って「仲介役(中継者)」として動作する特別なサーバーのことです。アクセスしたいサイトに直接接続する代わりに、まずプロキシサーバーへリクエストを送ります。