2016-09-09 10 views
3

Как определить константу в C++, которая указывает на изменяемый объект?Как определить конечную переменную (изменяемую константу) в C++?

Если я объявляю

static const CMyClass* IMPL; 

и назначить

const CMyClass* CSomeClass::IMPL = new CMyClass; 

, то я могу назвать только const функции на объекте. Его внутренности заблокированы. Это не то, что я хочу.

Если я оставляю квалификатор const, я могу переназначить указатель IMPL, поэтому он больше не защищен как константа, каким он должен быть. final, похоже, применим только к функциям в C++. Есть ли эквивалент переменных Java final в C++?

+0

Таким образом, вы хотите, чтобы указатель не был назначен, но указал на объект, подлежащий назначению? – NathanOliver

+0

Даже если вы не оставите 'const', вы можете переназначить указатель' IMPL'. –

+2

Возможный дубликат [В чем разница между константой int \ *, const int \ * const и int const \ *?] (Http://stackoverflow.com/questions/1143262/what-is-the-difference-between -const-int-const-int-const-and-int-const) – LogicStuff

ответ

7

Решение

class CMyClass{}; 

class CSomeClass{ 
    static CMyClass* const IMPL; 
}; 

CMyClass* const CSomeClass::IMPL = new CMyClass; 

Объяснение

const в C++ не является точным аналогом в Java final.

  • В Java final спецификатор относится к переменной и означает, что переменная не может быть переназначен (если объект ссылается этой переменной все еще может быть изменен).

  • В отличие от этого, в C++ const применяется к типу. Так как C++ имеет указатели, важно различать тип самой переменной-указателя и тип объекта, к которому эта переменная будет относиться. В зависимости от того, где вы помещаете свой const, он применяется к первому или последнему. Другие ответы более подробно описывают это.

+3

Не могли бы вы добавить некоторые комментарии ... Я не думаю, что он понимает, что это может решить его проблему, потому что он не знает, что он смотрит на – DarthRubik

7

Вы должны разместить const в нужном месте в декларации. Правило: const применяется к предмету сразу слева, если только оно не находится на самом левом краю, когда оно применяется справа.

Таким образом, эти два являются (изменяемые) указатели на константы целого:

const int * p; 
int const * p; 

Это постоянный указатель на (изменяемый) целое:

int * const p; 

И эти постоянные указатели константа целое число:

const int * const p; 
int const * const p; 
5

1) Указатель на константный элемент: const T* ptr

2) Const указатель на изменяемый элемент: T* const ptr

3) Const указатель на константный элемент: const T* const ptr

То, что вы хотите здесь 2): константный указатель на изменяемый элемент.

+0

Спасибо за указание 3). Мне ясно, что все мои константы (как я думал, они были) неизменны, но все же обменяны! – Paramaeleon

+0

Добро пожаловать @Paramaeleon. Удачи и счастливого взлома! –

0

C++ 'final' не связан с константами, он предназначен для виртуальных функций: он указывает, что виртуальная функция является концом строки и не будет переопределена.

Использование const_cast игнорировать сопзЬ и вызвать константный метод объекта:

const CMyClass* CSomeClass::IMPL = new CMyClass; 
const_cast <CMyClass *> (CSomeClass::IMPL) -> someNonConstMethod(); 

Но это «чувствует себя» неправильно; вы пытаетесь защитить свою переменную, сделав ее постоянной, поэтому переопределение const не похоже на то, что вы действительно хотите. Может быть:

  • Вместо того, чтобы защищать переменную с помощью константы, сделайте переменные-члены частными, так что аутсайдеры не могут возиться с ними. Затем предоставляйте функции доступа (неконстантные), чтобы позволить им манипулировать допустимыми способами.
  • Если у вас есть переменные-члены, которые необходимо изменить из методов const, отметьте их как «изменчивые».
  • Чтобы защитить объект от удаления вне вашего контроля, сделайте его деструктор закрытым.

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

  • Нет связанных вопросов^_^