2017-02-21 4 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

Что 'Голос: : Голос (голос const &) 'делать? – LogicStuff

+1

Ваш конструктор копий делает не то, что нужно; Я подозреваю, что исправление проблемы поможет вам решить эту проблему. Вы можете опустить его и вернуться к неявно созданному; или do 'mValue = copy.mValue;' –

+6

Ваш конструктор копий на самом деле не делает копию. Просто избавитесь от него и используйте предоставленный компилятором тот, который будет. – NathanOliver

ответ

2

Как указано в комментариях, ваш конструктор копирования является) не так и б) излишнего

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;' он устанавливает значение в «копию», а «Голос голоса = голосManager.mVoices [2];' не возвращает экземпляр «копировать»? – markzzz

+0

@paizza ваш конструктор копий был пуст – TemplateRex

+0

Я вижу :) Но я не устанавливаю там mValue. Я установил здесь 'mVoices [i] .mValue = 100.0;'. Поэтому, когда я возвращаю тот же голос (т. Е. «Голос голоса = голосManager.mVoices [2];»), я должен увидеть установленное значение. Нет? – markzzz

Смежные вопросы