2014-08-29 202 views
-1

我需要初始化這個變量:const WAVEFORMATEX *pFormat結構的字段有效值。C++ const結構初始化

首先我試着修改聲明後:(*pFormat).wFormatTag = 0;然後很快發現const修飾符不允許這樣的動作。然後我嘗試了內聯初始化的變體

new WAVEFORMATEX() { 0, 0, 0, 0, 0, 0, 0}; //or 
WAVEFORMATEX { 0, 0, 0, 0, 0, 0, 0}; 

第一次拋出'期待a'錯誤並且第二個初始化表達式不會返回正確的類型。有人可以幫忙嗎?有一個我以後使用的函數調用必須有一個const WAVEFORMATEX *類型的參數。

這裏的結構文檔:http://msdn.microsoft.com/en-us/library/windows/desktop/dd390970(v=vs.85).aspx

+2

如果該函數採用'const WAVEFORMATEX *'參數,這意味着您必須將它傳遞給WAVEFORMATEX結構的地址,並且該函數保證不會更改結構的內容。 – 2014-08-29 21:04:06

+0

爲何選票回落?對於爲什麼跛腳的原因,沒有任何評論的迴應票! – gordlonious 2014-08-29 21:09:38

+1

我不確定你想要解決的問題。使用'const T * ptr = new T;'是不理想的。你不能在這樣的指針上使用'delete ptr;'。你會泄漏記憶。 – 2014-08-29 21:22:30

回答

3

一個函數需要const WAVEWHATEVER*類型的參數並不意味着你必須聲明這個結構,使其同時成爲const WAVEWHATEVER*事實上,只需使用:

void foo(const WAVEWHATEVER* w) {} 

WAVEWHATEVER w; 
w.FormatTag = 0; 
// [...] and so on 
foo(&w); 

該功能只保證它不會改變您的原始w的內容。

+0

謝謝,我對C++很陌生。 – gordlonious 2014-08-29 21:07:40

1

我知道你在尋找的是:

const WAVEFORMATEX * pFormat = new WAVEFORMATEX{ 0, 0, 0, 0, 0, 0, 0}; 

這將允許你初始化一個表達const T*。還有其他方法可以使您的意圖在面臨更改時變得更加清晰或強健,例如創建工廠功能等。

這與您之前嘗試使用的區別在於缺少()。使用()將嘗試調用不帶參數的默認構造函數,然後在緊接着初始化程序列表後產生語法錯誤。

不使用new運算符將導致您在堆棧中而不是堆中分配內存,並且由於結果不是指針,因此類型錯誤。

+0

看來其他答案顯示瞭如何更好地使用您正在使用的API。 – YoungJohn 2014-08-29 21:07:54

+0

你爲什麼認爲其他答案更好?就可讀性而言,這種方式更加簡潔。我只需要記得從堆中刪除pFormat。 – gordlonious 2014-08-29 21:18:18

+2

另一個答案告訴你,也許你實際上不需要'const WAVEFORMATEX *',並且你可以在沒有這個約束的情況下實現你的目標。儘管如此,您可以決定什麼在您的實際應用中最適合。 – YoungJohn 2014-08-29 21:21:42