2017-02-21 42 views
0

不知道here發生的事情:我應該總是處理參考返回矢量嗎?

#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; 
} 

我設置mValue每個Voice與運營商[]價值100,但是當我嘗試用相同的[]操作檢索對象,現在看來,這不返回該元素?它打印0

相反,如果我這樣做:

Voice &voice = voiceManager.mVoices[2]; 

我終於可以看到更新後的值。

這裏發生了什麼?

+2

什麼呢'聲音: :語音(語音常量&)'嗎? – LogicStuff

+1

你的拷貝構造函數做錯了事;我懷疑修復它會解決你的問題。你可以忽略它並回退到隱式生成的那個;或者'mValue = copy.mValue;' –

+6

你的拷貝構造函數實際上並不拷貝。只要擺脫它,並使用編譯器提供了一個會。 – NathanOliver

回答

2

正如在評論中指出的,你的拷貝構造函數是一個)錯誤和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; 
} 

Live Example

請注意,我也沒有在構造未成年人清理了VoiceManager,通過使用成員 - 初始化語法。

至於其他的問題:初始化

Voice voice = voicemanager.mVoice[2]; 

實際調用你的拷貝構造函數

Voice(voicemanager.mVoice[2]); 

(這裏的=跡象並不意味着分配!)

+0

但是我問爲什麼:)爲什麼如果我使用'mVoices [i] .mValue = 100.0;'它將值設置爲「複製」,而'Voice voice = voiceManager.mVoices [2];'不返回「複製」實例? – markzzz

+0

@paizza你的拷貝構造函數是空的 – TemplateRex

+0

我看到:)但是我沒有在那裏設置mValue。我在這裏設置了'mVoices [i] .mValue = 100.0;'。所以,無論我設置該值,當我返回相同的語音(即'Voice voice = voiceManager.mVoices [2];')時,我應該看到設定值。沒有? – markzzz

相關問題