C ++:在从const指针指向的对象中调用非const函数(错误C2662)

时间:2011-04-22 09:44:47

标签: c++ const

我有一个带有指向对象的const指针的结构。它是const,因此指针不会改变,我不希望对象保持不变。我想在该对象中调用非常量函数,从而收到以下错误:

  

错误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 个答案:

答案 0 :(得分:19)

将您的结构更改为:

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

这将使指针而不是指针const

更详细的解释(另请参阅Wikipedia):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适用于声明之前或之后,则无需解密。

答案 1 :(得分:3)

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 :(得分:2)

使用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)

这是一种风格的首选,很多人更喜欢最左边的常量(并且足够聪明,可以自动阅读他们头脑中的声明: - )。

但是当你将typedef添加到混音中时,重要的是:
如果定义了类型别名(或同义词),则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'

因此,当您开始使用typedef时,意义可能会改变(如果您将const放在最左侧)并且在创建typedef时只进行文本剪切和粘贴。但是

最后回答这个问题。

你想在结构中使用const指针。为此,请确保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
 };