2011-04-22 59 views
2

我有一个带有指向对象的const指针的结构体。这是const,所以指针不会改变,我不希望有对象不变。我想调用该对象的非恒定功能,从而收到以下错误:C++:在从const指针指向的对象中调用非const函数(错误C2662)

error C2662: 'my_namespace::MyClass::myFunc' : cannot convert 'this' pointer from 'const my_namespace::MyClass' to 'my_namespace::MyClass &'

Conversion loses qualifiers

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

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

假设我不能让aNonConstFunc()常量。

回答

18

更改您的结构来:

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

+1对于最后一条语句,我以同样的方式执行。 – Xeo 2011-04-22 09:51:59

+0

C++是一个很好的语言...... – Jonathan 2011-04-22 09:55:05

+0

@Jonathan最终你会得到它的窍门;)。 – Darhuuk 2011-04-22 10:22:08

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

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

这是一种风格PREF和许多人喜欢在最左边的常量(和有足够的智慧自动在其磁头读出声明:-)。

,它成为重要的是当你添加的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 
}; 
相关问题