我有一个带有指向对象的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。
答案 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是声明中最左边的部分,否则它将应用于右侧。
// 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
};