1

こんにちは、いくつかのパブリック メンバー変数を読み取り専用にしようとしています。私は次のようなことができることを知っています:

private: int _x;
public: const int& x;
Constructor(): x(_x) {}


もっと扱いやすく読みやすいものを探しています。インターネット上でいくつかのテンプレートを見つけましたが、これらはすべて、このSO回答 でプロキシクラスとして説明されているものと同様です。

テンプレートをインクルードに入れ、変数のみを読み取る必要があるクラスの変数ごとに次のようなものを書くことができるように、そのプロキシクラスを適応させようとしています:

public: proxy<int, myClass> num;

毎回クラス名を言う必要がなければさらに簡単ですが、クラス名がテンプレートで識別されない限り、それを回避する方法がわかりません。

Visual Studio 2010 でこれを試しましたが、機能しません。理由を知っている人はいますか?

template <class T, class C>
class proxy {
    friend class C;
private:
    T data;
    T operator=(const T& arg) { data = arg; return data; }
public:
    operator const T&() const { return data; }
};

class myClass {
public:
    proxy<int,myClass> x;

public:
    void f(int i) {
        x = i;
    }
};

ありがとう

編集-誰かが私が何を意味するのか尋ねましたが、機能しません:

int main(int argc, char **argv)
{
    myClass test;
    test.f(12);
    cout << test.x << endl;
    return 0;
}

戻り値:

b.cpp(122) : error C2649: 'typename' : is not a 'class'
        b.cpp(128) : see reference to class template instantiation 'proxy<T,C>'
being compiled
b.cpp(136) : error C2248: 'proxy<T,C>::operator =' : cannot access private membe
r declared in class 'proxy<T,C>'
        with
        [
            T=int,
            C=myClass
        ]
        b.cpp(125) : see declaration of 'proxy<T,C>::operator ='
        with
        [
            T=int,
            C=myClass
        ]
4

2 に答える 2

4

これを変える:

template <class T, class C>
class proxy {
  friend class C;

これに:

template <class T, class C>
class proxy {
   friend C;

Cはテンプレート パラメーターであるためC、必ずしもクラス型であるとは限りません。

于 2012-09-02T20:17:32.587 に答える
0

あなたの問題はデザインにあると思います。カプセル化違反である「パブリック」メンバーは必要ありません。IoCのようなものを探していると思います。ビジターパターンを見てください。

class IStateHandler{
public:
  virtual void handleState( const proxy<int, myClass>& num )=0;
  virtual ~IStateHandler(){}
};

class myClass {
private:
    proxy<int,myClass> x;

public:
    void f(int i) {
        x = i;
    }

    void handleState( IStateHandler* stateHandler ){
       stateHandler->handle( x );
    }

};
于 2012-09-02T20:26:31.200 に答える