我想在一個類中定義一個變量,該變量可以被任何其他函數讀取,但只能由成員函數修改。例如,C#具有用於此目的的Property。傳統上,我們定義了一個返回私有成員變量的函數。但我認爲這看起來並不複雜。C++訪問控制
是否有任何其他方式在C++中做到這一點?
我想在一個類中定義一個變量,該變量可以被任何其他函數讀取,但只能由成員函數修改。例如,C#具有用於此目的的Property。傳統上,我們定義了一個返回私有成員變量的函數。但我認爲這看起來並不複雜。C++訪問控制
是否有任何其他方式在C++中做到這一點?
class A
{
private:
string m_string;
public:
const string& GetString() const
{
return m_string;
}
__declspec(property(get=GetString)) string String;
};
A a;
cout << a.String << endl;
還沒在C#一樣好,雖然。
當然還有的C++/CLI屬性(管理類),這是更接近C#屬性:
ref class A
{
private:
String^ m_theString;
public:
property String^ TheString
{
String^ get()
{
return m_theString;
}
}
};
哇!這就是我想要的!謝謝! – isbae93 2013-02-13 18:45:49
@ArneMertz不,不是C++/CLI。我更新了答案以顯示C++/CLI屬性。 – user1610015 2013-02-14 07:58:54
這是一個Microsoft擴展,不是標準的C++。所以它只會在MSVC上編譯。 – 2013-02-14 08:00:17
您對返回訪問私人會員的疑慮是沒有根據的。
class Thing
{
public:
const std::string& GetString() const { return m_String; } // users can access m_String by calling GetString()
void SomeRandomFunc() { m_String = "Hello"; } // member functions can write to m_String
private:
std::string m_String;
};
否。Getter函數(如果需要Setters也是)是C++訪問數據成員的方式。一般來說,你使任何數據成員都是一個私有變量來確保封裝。只有在您設計的內容不是真實的類時,您才使用公共數據成員,但僅僅是「一堆數據」本身沒有(很多)行爲,在這種情況下,通常將其定義爲結構。
如果你在Visual Studio中編寫比C++中的Property更像C#。但當然是編譯器特有的。如果你問我,我更喜歡「獲取」功能
什麼......真的?你能鏈接到文檔 – David 2013-02-12 15:51:31
有C++/CLI的屬性鏈接在這裏:http://www.codeproject.com/Articles/10352/C-CLI-Properties-Syntactic-sugar-for-accessor-meth – 2013-02-12 15:55:36
在C++中沒有這樣的屬性,即使在C#中也是如此,這是一對set/get函數。只是一些糖。
但是你可以做一些與財產看起來差不多的東西。
只要看看在這個類原型
template<class T, class Owner>
class Property {
friend Owner;
public:
Property(const T &_v) : m_v(_v) {
}
operator T() {
return m_v;
}
private:
T m_v;
Property<T,Owner>& operator = (const Property<T,Owner> &v) {
m_v = v.m_v;
return *this;
}
Property<T,Owner>& operator = (const T& v) {
m_v = v;
return *this;
}
};
而且在你的類公有成員聲明像
class Test {
public:
Test() : Data(0) {}
Property<int, Test> Data;
void SetData(int data) {
Data = data;
}
};
'運算符T()'是非常量的,所以你不能讀取const Test對象的'Test :: Data'的底層'int'。 '運算符T()'按值返回m_v,這可能會導致性能下降。此外,該模板屬性不遵守五的規則。 – 2013-02-12 16:07:01
你可以添加運算符T()const。按值返回對象也可以被管理。請不要把它當做生產代碼,這只是一個想法的例子。 – Ation 2013-02-12 16:28:11
所有的C#屬性是在你的談論與C同樣的事情,一個漂亮的包裝++ 。只需創建一個私有(或受保護的)成員變量,提供一個公共獲取和一個私有/受保護的setter,並且您實際上具有c#正在做的事情。複雜與否。 – 2013-02-12 15:47:02
@DavidHope或根本沒有安裝程序。 – 2013-02-12 15:50:22
這不是*上述問題的重複,因爲這是關於繼承,而這個關於C#風格的只讀訪問。 – 2013-02-14 07:55:51