不确定这里发生了什么:
#include <iostream>
#include <vector>
class Voice
{
public:
double mValue = 0.0;
Voice() { }
Voice(const Voice ©) {
}
};
class VoiceManager
{
public:
std::vector<Voice> mVoices;
VoiceManager() {
mVoices = std::vector<Voice>(numVoices, Voice());
for (int i = 0; i < numVoices; i++) {
mVoices[i].mValue = 100.0;
}
}
private:
int numVoices = 16;
};
int main()
{
VoiceManager voiceManager;
Voice voice = voiceManager.mVoices[2];
std::cout << voice.mValue << std::endl;
}
i为每个 Voice
设置了带有算子[]
的值100
的mValue
,但是当我尝试使用相同的[]
运算符检索对象时,似乎它返回并不是该元素吗?它打印0。
相反,如果我这样做:
Voice &voice = voiceManager.mVoices[2];
我最终可以看到更新的值。
这里发生了什么?
如注释中所示,您的复制构造函数是a)错误,b)多余的
class Voice
{
public:
double mValue = 0.0;
// don't provide default constructor, unless you have another constructor
// use compiler-generated copy-constructor
};
class VoiceManager
{
int numVoices = 16; // move up here so that member-initialization works
public:
std::vector<Voice> mVoices;
VoiceManager()
:
mVoices(numVoices) // member-initialize
{
for (int i = 0; i < numVoices; i++) {
mVoices[i].mValue = 100.0;
}
}
};
int main()
{
VoiceManager voiceManager;
Voice voice = voiceManager.mVoices[2];
std::cout << voice.mValue << std::endl;
}
实时示例
请注意,我还使用成员限制语法对VoiceManager
的构造函数进行了较小的清理。
至于另一个问题:初始化
Voice voice = voicemanager.mVoice[2];
实际上调用您的复制构造函数
Voice(voicemanager.mVoice[2]);
(这里的=
签名并不意味着分配!)