2011-04-22 50 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 
}; 
相關問題