2013-06-03 42 views
0

我認爲C++中的屬性可以用來設置變量的方法,同時仍然保持訪問的點符號。我錯了嗎?C++屬性不經過方法?

class Class { 
private: 
    int _number; 

    void putNumber(int number) { 
     if (number < 10) _number = 0; 
     else _number = number; 
    } 

    int getNumber() { 
     return _number; 
    } 

public: 
    __declspec(property(get = getNumber,put = putNumber)) int number; 
}; 

main() 
{ 
    Class classObj; 
    classObj.number = 2; 
    std::cout << classObj.number; 
} 

不應該輸出源代碼0嗎?它輸出2,但..

我如何能實現我期待的效果?維護點符號,但通過setter和getters訪問?

+4

這不是標準的C++ –

+0

有沒有這樣的事情在C「屬性」 ++。如果你想要這樣一個特性,你可以編寫自己的代理類來重載一個'T&'轉換操作符,但是如果你需要直接暴露數據成員,它通常被認爲是糟糕的設計。相反,試着弄清楚你的類真正代表什麼,並只展示一個高級接口。 –

+0

除Kerrek說的外,您的代理類還需要一個'T'轉換運算符和一個自定義'operator ='。但不是'T&'轉換操作符,因爲這不會讓您攔截「放入」操作。 –

回答

0

根據the documentation,獲得了「虛擬部件」被轉換成到存取器函數的調用。

這表明,存取函數必須給調用者訪問。試着讓它們公開?

1

雖然大家是正確的它不是標準配置,您正在使用的Visual Studio編譯和你不關心其他任何操作系統上運行,勇往直前。如果你是在VS編譯,你應該得到這個錯誤:

Error 1 error C2248: 'Class::putNumber' : cannot access private member declared in class 'Class'  

你的getter/setter方法是私有的,因此不能被訪問,你需要這樣修改代碼:

class Class { 
private: 
    int _number; 
public: 

    void putNumber(int number) { 
     if (number < 10) _number = 0; 
     else _number = number; 
    } 

    int getNumber() { 
     return _number; 
    } 

    __declspec(property(get = getNumber,put = putNumber)) int number; 
}; 

儘管根據你缺乏編譯錯誤的判斷,我懷疑你沒有在Visual Studio中編譯。

+0

或者他忽略了編譯錯誤,並運行最後編譯成功的任何版本。 –