Как я могу сделать класс, который иногда только для чтения, а иногда и для записи? Один из вариантов - с getter/seters и флагом, который указывает, является ли объект доступным только для чтения, но это много накладных расходов. Я также хочу, чтобы это свойство readonly работало глубоко над объектом, убедившись, что все содержащиеся в нем объекты также доступны только для чтения или записи. Вот пример кода желаемого поведения, который я пробовал, но не смог добиться, используя const.Как сделать объект глубоко readonly
Этот вопрос довольно общий, поэтому, вероятно, это было задано раньше, но я не смог найти хорошее решение этой точной проблемы в stackoverflow.
Пример кода: https://ideone.com/4cXyNF
class InnerClass {
public:
InnerClass(int j) : j_(j) {}
int j_;
};
class OuterClass {
public:
OuterClass(int i, InnerClass& c) : i_(i), reference_(c), pointer_(&c) {}
int i_;
InnerClass& reference_;
InnerClass* pointer_;
};
int main() {
InnerClass c(1);
OuterClass readwrite(2, c);
// Desire these 3 operations to work on the writable object
readwrite.i_ = 3;
readwrite.reference_.j_ = 4;
readwrite.pointer_->j_ = 5;
const OuterClass readonly(6, c);
// COMPILER ERROR: error: assignment of member 'OuterClass::i_'
// in read-only object
// readonly.i_ = 7;
// Desire this to be a compiler error, but it isn't
readonly.reference_.j_ = 8;
// Desire this to be a compiler error, but it isn't
readonly.pointer_->j_ = 9;
return 0;
}
Ну почему это не приводит к ошибке компиляции, потому что вы ** не ** изменения указателя или ссылки (эти значения все еще указывают на одно и то же) .... Я думаю, вы могли бы использовать шаблонное решение (мне нужно было бы подумать об этом немного больше) – DarthRubik
Вместо того, чтобы спрашивать, как это сделать Не могли бы вы объяснить, чего вы действительно пытаетесь достичь? То, что вы просите, довольно сложно сделать, и вполне вероятно, что ваше основное требование на самом деле имеет более простое решение. –