2013-02-12 96 views
0

我想在一個類中定義一個變量,該變量可以被任何其他函數讀取,但只能由成員函數修改。例如,C#具有用於此目的的Property。傳統上,我們定義了一個返回私有成員變量的函數。但我認爲這看起來並不複雜。C++訪問控制

是否有任何其他方式在C++中做到這一點?

+0

所有的C#屬性是在你的談論與C同樣的事情,一個漂亮的包裝++ 。只需創建一個私有(或受保護的)成員變量,提供一個公共獲取和一個私有/受保護的setter,並且您實際上具有c#正在做的事情。複雜與否。 – 2013-02-12 15:47:02

+0

@DavidHope或根本沒有安裝程序。 – 2013-02-12 15:50:22

+0

這不是*上述問題的重複,因爲這是關於繼承,而這個關於C#風格的只讀訪問。 – 2013-02-14 07:55:51

回答

1
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; 
     } 
    } 
}; 
+0

哇!這就是我想要的!謝謝! – isbae93 2013-02-13 18:45:49

+0

@ArneMertz不,不是C++/CLI。我更新了答案以顯示C++/CLI屬性。 – user1610015 2013-02-14 07:58:54

+0

這是一個Microsoft擴展,不是標準的C++。所以它只會在MSVC上編譯。 – 2013-02-14 08:00:17

0

您對返回訪問私人會員的疑慮是沒有根據的。

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

否。Getter函數(如果需要Setters也是)是C++訪問數據成員的方式。一般來說,你使任何數據成員都是一個私有變量來確保封裝。只有在您設計的內容不是真實的類時,您才使用公共數據成員,但僅僅是「一堆數據」本身沒有(很多)行爲,在這種情況下,通常將其定義爲結構。

0

如果你在Visual Studio中編寫比C++中的Property更像C#。但當然是編譯器特有的。如果你問我,我更喜歡「獲取」功能

+0

什麼......真的?你能鏈接到文檔 – David 2013-02-12 15:51:31

+0

有C++/CLI的屬性鏈接在這裏:http://www.codeproject.com/Articles/10352/C-CLI-Properties-Syntactic-sugar-for-accessor-meth – 2013-02-12 15:55:36

0

在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; 


    } 
    }; 
+0

'運算符T()'是非常量的,所以你不能讀取const Test對象的'Test :: Data'的底層'int'。 '運算符T()'按值返回m_v,這可能會導致性能下降。此外,該模板屬性不遵守五的規則。 – 2013-02-12 16:07:01

+0

你可以添加運算符T()const。按值返回對象也可以被管理。請不要把它當做生產代碼,這只是一個想法的例子。 – Ation 2013-02-12 16:28:11