2013-02-12 4 views
0

Я хочу определить внутри класса переменную, которая может быть прочитана любой другой функцией, но которая может быть изменена только функцией-членом. Например, у C# есть свойство для этой цели. Традиционно мы определили функцию, которая возвращает частную переменную-член. Но я думаю, что это не выглядит сложным.Контроль доступа C++

Есть ли другой способ сделать это на C++?

+0

Все C# свойство является довольно обертывание на одном и том же ваш говорим о с C++ , Просто создайте частную (или защищенную) переменную-член, предоставите публичный доступ и приватный/защищенный сеттер, и вы фактически получите именно то, что делает C#. Сложный или нет. –

+0

@DavidHope или нет сеттер вообще. –

+0

Это * не * дубликат вопроса, о котором говорилось выше, поскольку это о наследовании, и это о CIN-стиле для чтения. –

ответ

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

+0

@ArneMertz Нет, это не C++/CLI. Я обновил ответ, чтобы показать свойства C++/CLI. – user1610015

+0

Это расширение Microsoft, а не стандартное C++. Поэтому он будет компилироваться только на MSVC. –

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++, например C#. Конечно, компилятор. Если вы спросите меня, я предпочитаю функцию «получить»

+0

Что ... действительно ?! Вы можете ссылаться на документы – David

+0

Есть свойства для C++/CLI ... ссылка здесь: http://www.codeproject.com/Articles/10352/C-CLI-Properties-Syntactic-sugar-for-accessor-meth –

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() 'не является константой, поэтому вы не можете прочитать базовый' int' 'Test :: Data' объекта const' Test'. 'operator T()' возвращает значение m_v по значению, это может привести к ухудшению производительности. Также свойство template не подчиняется правилу 5. –

+0

вы можете добавить оператор T() const. Также можно управлять возвращаемым объектом по значению. Пожалуйста, не рассматривайте это как производственный код, это просто пример идеи. – Ation

Смежные вопросы