A. Насколько полезной или громоздкой является следующая методика использования той же функции как для геттера, так и для сеттера путем возврата ссылки?Опорный возврат для сеттера
B. Насколько хороша практика добавления константы в конце описаний функций в случае геттеров и сеттеров?
#include <iostream>
class A
{
int varReadWrite_;
int varReadOnly_;
int varRestricted_;
public:
A() : varReadOnly_(25) {}
virtual ~A() {}
int& varReadWrite() { return varReadWrite_; }
int varReadOnly() { return varReadOnly_; }
int varRestricted() { return varRestricted_; }
void setVarRestricted(int i); //throwable
};
int main(int argc, char *argv[])
{
A a;
a.varReadWrite() = 45;
std::cout << a.varReadOnly() << a.varReadWrite() << std::endl;
return 0;
}
Причина, почему я выбрал именно этот проект был:
- легкости доступа явно только для чтения или явно записываемых переменных.
- ограниченные (я не знаю, что еще их называть), переменные, которые требуют дезинфекции и фильтрации перед назначением - для этих переменных может потребоваться явный сеттер.
Использование boost fusion map также интересную возможность, как shown here
Update
Const Ссылка Пользователи интересны только для чтения доступ к переменным, например,
class A {
int mA;
public:
int& a;
A(int a_ = 0) : mA(a_), a(mA) {}
};
Практически это происходит с дополнительным усилием в коде копировать и перемещать конструкторы, что является приемлемым компромиссом для меня.
Cpp Reference Copy Construtor says
неявно объявленный или дефолт конструктор копирования для класса Т определяются как удаляется, если ... T имеет не-статические элементы данных, которые не могут быть скопированы (удалили, недоступный , или неоднозначные конструкторы копирования);
Это так же хорошо или громоздко, как использование переменной открытого элемента. –
Возвращение ссылки обычно не считается хорошей практикой, так как пользователи могут держаться за нее, и вы не знаете, когда могут произойти изменения, и это усложняет жизненные проблемы. – sje397
, если никакое изменение переменной не может нарушить инвариант класса, сделайте его общедоступным. если не так, используйте правильные методы, которые имеют описательные имена, выполняют согласованные изменения и поддерживают инвариант класса. – sp2danny