2012-09-02 73 views
1

嗨我想讓一些公共成員變量只讀。我知道我可以做這樣的事情:如何在Visual Studio 2010中使只讀類成員變量

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


我在尋找的東西更易於管理,更易於閱讀。我在互聯網上發現了幾個模板,所有這些模板與this 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 
     ] 
+6

所以你說模板比'const'更易於管理和閱讀? –

+0

告訴我們「它不工作」的意思是 –

+0

@Luchian一點都不。我需要一些公開只讀的內容,並且私下沒有這些限制。 'const'很棒,它不是我在這裏找的東西。如果我使用前者,那麼在所有的類函數中,我都必須附加一個前綴,並且有很多變量可以用來做這件事。我認爲它只是爲了更醜陋的代碼。 – loop

回答

4

更改此:

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

這樣:

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

因爲C是一個模板參數,它不能保證C必然是一個類類型。

+0

這工作表示感謝。我只是嘗試代理一些字符串變量,我注意到如果我有'proxy str'之類的東西,並且我嘗試將str傳遞給一個需要字符串引用的函數,編譯器將會出錯'無法將參數1從'代理'到'std :: string&''。你知道我在那裏做錯了什麼嗎? – loop

+0

@test:你想要一個私有的非const'運算符T&(){return data; }'在'proxy'類模板中允許'myClass'將代理轉換爲對'T'的非const引用。 – Oktalist

+0

@Oktalist我曾嘗試過,但後來我無法在公共場所訪問test.x:'error C2248:'proxy :: operator int&':無法訪問在類'proxy '中聲明的私有成員' – loop

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); 
    } 

}; 
相關問題