2016-06-08 321 views
1

下面的代碼在'func'(& pobj);'在函數main()中不能將'X * *'轉換爲'const X * *'並且在參數1(想要'const X * *',得到'X * *')中輸入不匹配。 「即使它是傳遞指針參數的正確方法。並且在評論這一特定行,即'func(& pobj);'並取消註釋上面的兩行,它聲明瞭所需類型的新的'const'指針'pp'(在func的參數中),但仍然在聲明和分配'pp'的行上拋出一個錯誤,說'不能轉換'X * * '到main()函數中的'const X * *'。傳遞指向C++中另一個指針的'const'指針

using X = int; 

void func(const X **); 

int main() { 
    X *pobj = new X(58); 

    // const X **pp = &pobj; // ERROR 
    // func(pp); 

    func(&pobj); // ERROR 
} 

我相信這是傳遞常量指針作爲參數的正確方法,我只是不明白爲什麼程序無法編譯。任何人都可以指出上述代碼中的錯誤,並且如果我錯了,建議我使用正確的邏輯/語法?提前致謝。

UPDATE: 此問題被標記爲重複,但它沒有解決手頭問題的答案。因此,如果Stack Overflow社區能夠幫助我解決我的問題,我會很喜歡它。謝謝。

回答

2

這樣做:

const X * pobj = new X(58); 
// ^^^^^^ 

func(&pobj); 

現在pobj是一個指針到const- X,其地址爲const X **類型的要求。

如果你想保留原來的(可變)指針,你需要一個新的常量指針第一:

X * p = new X(58); 
const X * q = p; 

func(&q); 
+0

這解決了模塊調用的問題,但是這並不能讓我們改變指針'pobj'指向的值對於我的程序來說是必不可少的(這只是其中的一小部分,它有錯誤)。你有任何想法來解決這個問題/錯誤?感謝您的回覆。 – hecate

+0

@hecate:聽起來像你沒有正確定義你的模塊API。如果你想修改一個東西,你需要指向一個可修改的東西。也許檢查其他答案。 –

+0

請注意,您提供的第二個解決方案保留在原始指針不起作用.. :-( – hecate

2

您將需要申請const的指針到指針:

void func(X *const *); 

... 
    X * const *pp=&pobj; // ERROR  
    func(&pobj); // ERROR 
... 

void func(X * const * obj) { // module code goes here 
} 
+0

Heyy感謝那個真正解決了這個問題的人,但是你能介紹一下在兩個星號(*)之間放置'const'的理論/意義/邏輯,因爲它不是通常的做法嗎?也告訴我爲什麼程序失敗時,只用'func(&pobj);'而不聲明指針'pp'?]調用該函數?再次感謝朋友:-) – hecate

+0

簡而言之:'const X *'實際上是'X const *' - 使指針類型爲'const'(而不是'X')。'const X **'是'X const * *',而不是'X * const *'。'X * const *'可以指向'const X *',並且可以將'X * obj'設爲'X const * obj'來實現這一點。查看「重複」鏈接以查找更多信息 – Ajay

0

如果阿賈伊的答案是不恰當的,因爲你不能改變FUNC()的接口,

,如果Kerrek的答案是不行的,因爲FUNC()改變指針,它必須被分配回,不發生:

X * p = new X(58); 
const X * q = p; 
func(&q); 
p = q; // errror 

然後只需使用一個澆鑄:

func(const_cast<const X**>(&p)) 
相關問題