我应该始终处理参考返回矢量吗?



不确定这里发生了什么:

#include <iostream>
#include <vector>
class Voice
{
public:
    double mValue = 0.0;
    Voice() { }
    Voice(const Voice &copy) {
    }    
};
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设置了带有算子[]的值100mValue,但是当我尝试使用相同的[]运算符检索对象时,似乎它返回并不是该元素吗?它打印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]);

(这里的=签名并不意味着分配!)

最新更新