C ++: вызов неконстантной функции в объекте, указанном из константного указателя (ошибка C2662) - PullRequest
3 голосов
/ 22 апреля 2011

У меня есть структура с константным указателем на объект.Это так, что указатель не изменится, я не хочу, чтобы объект был постоянным.Я хотел бы вызвать непостоянную функцию в этом объекте, таким образом получая следующую ошибку:

ошибка C2662: 'my_namespace :: MyClass :: myFunc': невозможно преобразовать указатель 'this' из'const my_namespace :: MyClass' в 'my_namespace :: MyClass &'

Преобразование теряет квалификаторы

struct MyStruct
{
    MyStruct( const MyClass* init_my_class_ptr );
    const MyClass* my_class_ptr;
};

...
struct_instance.my_class_ptr->aNonConstFunc();
...

Предположим, я не могу сделать aNonConstFunc() const.

Ответы [ 3 ]

19 голосов
/ 22 апреля 2011

Измените свою структуру на:

struct MyStruct
{
    MyStruct( const MyClass* init_my_class_ptr );
    MyClass* const my_class_ptr;
};

Это сделает указатель вместо указателя const.

Более подробное объяснение (см. Также Википедия ): ключевое слово const применяется ко всему, что предшествует ему, за исключением случаев, когда впереди ничего нет, тогда оно применяется к тому, что идет после него. Итак:

const A * object; // Non-const pointer to const A
A const * object; // Non-const pointer to const A
A * const object; // Const pointer to non-const A
const A * const object; // Const pointer to const A
A const * const object; // Const pointer to const A

Так вот, это просто личное предпочтение, но именно поэтому я всегда ставлю const после того, что должно быть const. При применении повсеместно в вашем коде это позволяет очень легко определить, что именно должно быть const. Нет необходимости расшифровывать, если const применяется к заявлению до или после него.

3 голосов
/ 22 апреля 2011

Изменить const MyClass* my_class_ptr; на MyClass* const my_class_ptr;

const MyClass* my_class_ptr; объявляет my_class_ptr указателем на объект const MyClass.

MyClass* const my_class_ptr объявляет my_class_ptr постоянным указателем на MyClass объект, и это то, что вам нужно.

2 голосов
/ 22 апреля 2011

Использование const.

Общее правило заключается в том, что const применяется к объекту слева от const.Если const не является левой частью декларации, то она применяется справа.

// Thus these two are equivalent.
const char*  data1;   // 'pointer to' const char (const applied to right because it has nothing on left)
char const*  data2;   // 'pointer to' const char

Я предпочитаю ставить const справа, так как затем я могу последовательно использовать правило чтения типов справа налево.

char const*   data3;  // 'pointer to' const char   (reading right to left)
char* const   data4;  // const 'pointer to' char   (reading right to left)

Это стиль, и многие люди предпочитают const в крайнем левом углу (и достаточно умны, чтобы автоматически прочитать объявление в своей голове: -).

НО Когда это становится важным, когда вы добавляете typedefs в смесь:
typedef НЕ является текстовой заменой, если определяет псевдоним типа (или синоним).

typedef char* CHARP;

const char*  data5a;   // 'pointer to' const char
const CHARP  data5b;   // const ''pointer to' char' ***(NOT THE SAME AS above)***

char* const  data6a;   // const 'pointer to' char
CHARP const  data6b;   // const ''pointer to' char'

Так что, когда выначните использовать typedefs, значение может измениться (если вы поместите const в крайний левый угол) и просто сделайте текстовую вставку при создании ваших typedefs.Но th

Наконец, чтобы ответить на вопрос.

Вам нужен константный указатель в вашей структуре.Для этого убедитесь, что const находится справа от символа «*».

 struct MyStruct
 {
    MyStruct(MyClass* const  init_my_class_ptr)
        : my_class_ptr(init_my_class_ptr)
    {}

    MyClass* const my_class_ptr;    // const pointer to MyClass
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...