У меня возникли проблемы с шаблоном struct.struct with const member
template<typename T>
struct A{
const int v1;
T* v2;
};
Моя цель состоит в том, чтобы сделать v1
всегда не редактируется, в то время как v2
должны быть доступны для редактирования, если я использую T
и не редактируемые, если я использую const T
как тип.
Если я создаю конструктор для инициализации A
, то структура становится:
template<typename T>
struct A{
const int v1;
T* v2;
A() : v1(-1) { v2=NULL; }
A(int value) : v1(value) { v2=NULL; }
};
Но г ++ говорит, что я нужен конкретный оператор присваивания:
error: non-static const member ‘const int A::v1’, can’t use default assignment operator
Но мой оператор присваивания должен также разрешить редактирование от v1
. Единственное, что я хотел бы избежать это изменить с внешней стороны, что-то вроде:
A a;
a.v1=10;
Есть ли способ осуществить это (без создания геттер/сеттер или с помощью указателя на новый A (Int) с требуемым значением)?
Что делать, если я объявляю v1 как const int *? Он может ссылаться на какое-то значение, но не может его редактировать.
«без преобразования в класс-структуры (...)» У вас уже есть класс. –
Вы должны понять, что в C++ struct IS является классом, просто очень специфическим типом класса. Структура - это класс, в котором все открыто. – Poodlehat
Если оператор присваивания может изменять элементы 'const', то у вас все еще есть проблема * редактирования снаружи *, потому что я могу просто выполнить назначение всего объекта вместо того, чтобы самостоятельно изменять obj.v1 – Praetorian