Saya mencoba membuat templat kelas yang akan memiliki vektor objek, dan itu akan dapat menjalankan fungsi kelas objek pada mereka, jadi saya tidak perlu mengulang lemparan objek dan menjalankan kelas saya bisa memperbaiki sesuatu seperti

allObjects.runFunc(objectsType::someFunc); 

Di kelas saya ingin 3 perintah:

  • add - yang menambahkan item ke Grup
  • remove - menghapus Item
  • runFunc(someFunc) - itu yang paling penting, dan saya ingin menjalankan someFunc pada semua objek di Grup

Dan kelas akan memiliki satu variabel:
std::vector<Object> objects - yang akan menyimpan semua objek

Jadi saya sudah mencari banyak di internet dan belum menemukan apa yang saya butuhkan namun saya mencoba menggunakan std::bind dan mendapatkan beberapa gangguan yang sangat aneh.

Kelas (dalam file .h):

#pragma once
#include <vector>


template<class Object>
class Group {
public:
    void add(Object &object);
    void runFunc(void(Object::* func)(void));

private:
    std::vector<Object> objects;
};

template<class Object>
inline void Group<Object>::add(Object &object)
{
    objects.push_back(object);
}

template<class Object>
inline void Group<Object>::runFunc(void (Object::* func)(void))
{
    for (int i = 0; i < objects.size(); i++)
    {
        (objects[i].func)();
    }
}

Kesalahan yang saya dapatkan adalah func bukan anggota gameObject di mana gameobject adalah tipe yang saya uji grupnya, dan ya, itu memang memiliki fungsi pembaruan.

2
eitan 03 20 September 2019, 13:24

1 menjawab

Jawaban Terbaik

Doa Anda terlihat salah (pikirkan: func adalah pointer ke fungsi):

Ganti baris ini:

(objects[i].func)();

dengan

(objects[i].*func)();

Karena itu, saya sangat merekomendasikan menggunakan std::function dan mungkin juga std::bind alih-alih 'penunjuk fungsi mentah' (ketika sepertinya Anda tidak dibatasi oleh perpustakaan pihak ke-3 ).

5
darune 18 Oktober 2019, 10:59