Pertanyaan Mengedit daftar di dalam template tidak menyimpan


Saya memiliki loop yang ingin saya gunakan beberapa kali tanpa menyalin dan menempelkan kode sehingga saya menggunakan template. Jawaban saya gunakan untuk template. Template dan loop itu sendiri berfungsi sebagaimana mestinya, tetapi mengubah variabel dari daftar di dalam fungsi yang disebut di dalam loop tidak berfungsi. Jika saya mengubah s.Color di dalam fungsi 'Test', itu tidak berubah di luar fungsi itu atau loop contoh.

Jadi mengapa tidak berubah di luar lingkaran? Dan bagaimana cara memastikannya berubah di luar lingkaran?

Kerangka:

void Test(TrafficLight s) {
    switch (s.Type) {
    case hfdWeg:
        s.Color = queueCurrent.HoofdwegColor;
        break;
    case zWeg:
        s.Color = queueCurrent.ZijwegColor;
        break;
    case vtPad:
        s.Color = queueCurrent.VoetpadColor;
        break;
    default:
        std::cout << "\nError";
        break;
    }
}

template<typename Func>
inline void do_something_loop(Func f)
{
    for (std::list<TrafficLight>::iterator i = Lichten.begin(); i !=    Lichten.end(); ++i) {
        TrafficLight & s(*i);
        f(s);
    }
}

Memanggil template:

do_something_loop(Test);

Daftar:

std::list<TrafficLight> Lichten;

Kelas TrafficLight:

class TrafficLight {
private:
public:
    TrafficLight(TrafficLightType type, TrafficLightColor color = R) {
        Color = color;
        Type = type;
    }
    TrafficLightColor Color;
    TrafficLightType Type;
};

5
2017-11-23 09:29


asal


Jawaban:


Saya seharusnya:

void Test(TrafficLight s) { ... }

seharusnya:

void Test(TrafficLight& s) { ... }

karena sekarang Anda mengedit salinannya.

Jadi harus lulus dengan referensi sebagai gantinya.


5
2017-11-23 09:31



Ubah ini:

void Test(TrafficLight s)

untuk ini:

void Test(TrafficLight& s)

karena Anda harus melewati referensi agar perubahan tetap ada setelah fungsi dihentikan.

Kode Anda melewati argumen berdasarkan nilai (itu menciptakan a salinan dari s di dalam tubuh Test()).


2
2017-11-23 09:32