Вопрос о стиле геттеров/сеттеров в C++

Рейтинг: 11Ответов: 4Опубликовано: 14.01.2011

Что предпочитает уважаемое сообщество, и как аргументирует свои предпочтения:

классический вариант:

class TFoo
{
    int value;
public:
    int ValueGet() { return value; }
    void ValueSet(int v) { value = v; }
};

альтернатива, основанная на перегрузке функций:

class TFoo
{
    int value;
public:
    int Value() { return value; }
    void Value(int v) { value = v; }
};

интересен взгляд со стороны: что выглядит более логичным и корректным?

Ответы

▲ 6

в C#, C++, Java делаю одинаково:

class TFoo
{
    int _Value;
public:
    int getValue() { return _Value; }
    void setValue(int v) { _Value = v; }
};

средства генерации кода позволяют такое получить :-)

▲ 5

Зачем нужны эти геттеры и сеттеры? Я конечно не буду предлагать сделать это свойство общедоступным, но можно сделать вот так:

#include <iostream>

class TFoo {
    int val;
public:
    int &value() {
        return value;
    }
};
int main() {
    TFoo obj;
    obj.value() = 235;
    std::cout << obj.value();
    return 0;
}
▲ 3

Дело вкуса. Первый вариант удобен при чтении кода, второй при написании кода.

Но.

class TFoo
{
    int value;
public:
    virtual int Value() { return value; }
    virtual void Value(int v) { value = v; }    
};

Код ниже уже не будет работать. Потому что потребуется переопределить второй метод Value(int v), либо using TFoo::Value в теле класса TBoo.

сlass TBoo : public TFoo
{
..
    virtual int Value() { /*Делаем нечто специальное*/ }
..

};

...
 TBoo *Boo = new TBoo;
 Boo->Value(5);
...

Итог: второй способ возлагает некоторые трудности связаные с перегрузкой функций.

▲ 3

Если это действительно свойство - т.е. произвольное количество вызозов не изменяет состояние класса - то int Value(), в противном случае - int GetValue(). Setter всегда именуется void SetValue(const ValueType &vt), уж больно выглядит как функция.