2013-12-25 5 views
0

Думая о способе имитации свойства C# 's в C++, я пришел к следующему решению:C# -как свойства в C++

#include <iostream> 

class obj_with_property { 
private: 
    class mykey {}; 

public: 
    class int_property { 
    private: 
     int m_v; 
    public: 
     int_property (int v, mykey) : m_v (v) { 
     } 

     int_property & operator = (int v) { 
      m_v = v; 
      return * this; 
     } 

     operator int() const { 
      return m_v; 
     } 
    }; 

    int_property A; 

    obj_with_property() : A (int_property (0, mykey())) { 
    } 
}; 

int main(int argc, char **argv) { 
    obj_with_property obj; 
    std::cout << obj.A << std::endl; 
    obj.A = 25; 
    std::cout << obj.A << std::endl; 
    return 0; 
} 

Я думаю, этот подход может быть дополнительно улучшить, например, сделав int_property шаблоном и т. д. Теперь я не могу себе представить, что я первый, у кого есть эта идея. Кто-нибудь знает, обсуждался ли подобный подход в любом месте?

+0

Я сделал такие вещи, в поддерживаемых значениях по умолчанию и иерархических свойствах, и был шаблонизирован. Я также однажды установил поддержку setter (так что 'property = x' вызовет функцию), но поскольку он не был использован в моем проекте, я опустил его. Я думаю, что ваш подход на правильном пути. – Synxis

+0

Вопрос: «Кто-нибудь знает, обсуждался ли подобный подход где-нибудь?» В этом случае мне не нужно изобретать колесо. – JohnB

+0

NO. Я не хочу обсуждать *, как можно моделировать свойства на C++. Мой точный вопрос заключается в том, обсуждал ли какой-либо из различных гуру C++ этот конкретный подход в любой из многих книг или блогов C++. – JohnB

ответ

2

На самом деле вы можете сделать это легко, используя шаблоны. Вот базовая реализация: Теперь я видел в ваших комментариях, что вы не хотите такой ответ, как этот, так что это касается преимуществ других.

Я сам не буду использовать этот подход, поскольку в большинстве создаваемых библиотек я не разрешаю пользователям напрямую создавать объекты, поэтому следующий подход не будет работать без дальнейших оберток.

template<class T> 
class property 
{ 
    T value_; 
public: 
    property(){} 
    property(T v) : value_(v){} 
    property(property<T> const & other) : value_(other.value_){} 

    property<T> & operator=(property<T> const& other) 
    { 
     value_ = other.value_; 
     return *this; 
    } 

    operator T(){return value_;} 
}; 

class object_with_properties 
{ 
public: 
    object_with_properties(){} 

    property<int> intP; 
    property<double> doubleP; 
    property<std::string> strP; 
}; 

Теперь вы можете использовать его в коде следующим образом:

object_with_properties o; 
o.intP = 1; 
o.doubleP = 1.0; 
o.strP = std::string("1"); 

Теперь этот код имеет свои ограничения, поскольку T должен иметь конструктор по умолчанию экспонированным, но он должен работать в большинстве случаев, когда вы предоставите пользователям создавать объекты напрямую.

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