C ++ - 如何在Visual Studio 2010中创建只读类成员变量

时间:2012-09-02 19:51:18

标签: c++ class constructor const readonly

您好我正在尝试将一些公共成员变量设为只读。我知道我可以这样做:

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


我正在寻找更易于理解和更易于阅读的内容。我在互联网上找到了几个模板,所有这些模板都与this SO中的代理类相似。

我正在尝试调整该代理类,以便我可以将模板放在include中,并为类中的每个变量编写类似的内容,我只需要读取变量:

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
        ]

2 个答案:

答案 0 :(得分:4)

改变这个:

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

到此:

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

由于C是模板参数,因此无法保证C必定是类类型。

答案 1 :(得分: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 );
    }

};