2014-08-29 152 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