2015-12-20 3 views
3

настоящее время у меня это:C++ - Как создать свойство, которое можно использовать с _ внутри класса?

template <typename T> 
class property<T, kPropertyReadOnly> { 

    T value; 

public: 
    property() {} 
    property(T initValue) : value(initValue){} 

    T & operator = (const T &i) { 
     return value = i; 
    } 

    operator T const &() const { 
     return value; 
    } 
}; 

Какой вид приносит свойства C++. Скажем, у нас есть класс:

class foo { 
    property<int> myProperty; 
} 

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

Foo foo(); 
foo.myProperty = 2; 

Но внутри класса Foo, я хотел бы чтобы быть в состоянии сделать это:

void Foo::myFooFunction() { 
    _myProperty = 2;  
} 

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

foo._myProperty = 2; 

Я знаю, что шаблоны могут делать много магии, но могут ли они это сделать?

+0

Чтобы уменьшить вероятность столкновения с символами компилятора, я рекомендуем использовать '_' как * суффикс * (в конце), а не как * префикс * (в начале). –

+0

Можете ли вы объяснить, почему? Я хотел бы использовать его в начале, потому что тогда автозаполнение помогает много, при наборе подчеркивания вы видите все переменные-члены. – keyboard

+0

Поскольку в соответствии со стандартом языка предшествующие символы подчеркивания зарезервированы для символов компилятора. Языковой адвокат или кто-то с копией стандарта может ссылаться на точное местоположение. Или вы можете искать в Интернете «компилятор подпредов C++». –

ответ

3

Если я понял ваш вопрос хорошо, что вы можете сделать, это интерфейс вашей частной переменной с общественной ссылкой на него:

class Foo { 
    property<int> _myProperty; 
public: 
    property<int> &myProperty = _myProperty; 

    void myFooFunction() { 
    _myProperty = 2;  
    } 
}; 

Live Demo

+0

Эй, опять;) Да, это работает, спасибо. Но есть ли более элегантное решение, которое не нуждается в двух отдельных строках? – keyboard

+0

@keyboard Я так не думаю. Вам нужна по крайней мере две строки для переменной и одна для псевдонима;) – 101010

+0

Хорошо, спасибо. Может быть, я поеду для определения, который сделает это для меня;) – keyboard

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