我对C++和一般编译语言非常陌生我有一个强烈的解释背景,所以我试图让我的头在编译时无法访问某些东西的限制。将代码块优化为循环
目前我有一大块代码看起来像这样:
//New note, note36
MemoryInputStream* input36 = new MemoryInputStream(BinaryData::C1hard1_wav, BinaryData::C1hard1_wavSize, false);
auto reader36 = audioFormatManager.createReaderFor(input36);
BigInteger note36;
note36.setRange(36, 1, true);
addSound(new SamplerSound("note36", *reader36, note36, 36, 0.001, 0.01, 26.0));
delete input36;
delete reader36;
//New note, note37
MemoryInputStream* input37 = new MemoryInputStream(BinaryData::Csharp1hard1_wav, BinaryData::Csharp1hard1_wavSize, false);
auto reader37 = audioFormatManager.createReaderFor(input37);
BigInteger note37;
note37.setRange(37, 1, true);
addSound(new SamplerSound("note37", *reader37, note37, 37, 0.001, 0.01, 26.0));
delete input37;
delete reader37;
此代码重复48次在该方法中,这是不好的实践。我将如何在PHP中实现这样的一个例子,解释型语言会是这个样子
$noteMap = array(36 => "C1", 37 => "Csharp1");
foreach($noteMap as $midiNumber => $note)
{
$name = $note . "hard1_wav";
$size = $note . "hard1_wavSize";
$input = new MemoryInputStream(BinaryData::$name, BinaryData::$size, false);
$reader = audioFormatManager->createReaderFor($input);
//I know this bit is bad PHP, no bigintegers in PHP but I can't think of a way to replicate it for arguments sake
$note = 0;
$note->setRange($midiNumber, 1, true);
addSound(new SamplerSound("note".$midiNumber, $reader36, $note, $midiNumber, 0.001, 0.01, 26.0));
}
这是更易于管理和重用。我所做的更改无需在整个文件中仔细重复,并且可以快速进行更改。我知道将变量作为函数名传递并不是在编译语言中完成的,但即使考虑到这一点,也必须有一种方法将我的大代码块包装成一个整洁的循环,但我无法找到解释的资源它对我来说。
你不能在C++中做到这一点。变量名称在运行时不可修改。代替阅读器和MIDI通道,使用'std :: vector'或其他容器并循环播放。 – user0042
在C++中,您可以对地图使用'std :: map',对'foreach'使用'for'范围。而且您不必为'input'或'reader'使用低效的动态分配。 –
@ user0042:他的代码不需要运行时变量名称。 –