Rumah > pembangunan bahagian belakang > C++ > Bolehkah C Menghidupkan Objek daripada Rentetan Nama Kelas?

Bolehkah C Menghidupkan Objek daripada Rentetan Nama Kelas?

Susan Sarandon
Lepaskan: 2024-12-26 05:37:44
asal
397 orang telah melayarinya

Can C   Instantiate Objects from Class Name Strings?

Bolehkah Objek Dimulakan daripada Rentetan Nama Kelas dalam C ?

Adakah terdapat mekanisme dalam C untuk membuat instantiate objek daripada rentetan yang mewakili nama kelasnya , menghapuskan keperluan untuk mentakrifkan pernyataan if-else secara eksplisit untuk setiap kelas terbitan berpotensi dalam kilang kelas?

Masalah:

Pertimbangkan struktur kelas berikut:

class Base;
class DerivedA : public Base;
class DerivedB : public Base;
// etc...
Salin selepas log masuk

Dan kelas kilang yang sepadan, BaseFactory, yang mencipta contoh terbitan kelas berdasarkan rentetan nama kelas yang ditentukan:

class BaseFactory {
public:
  BaseFactory(std::string &sClassName) { msClassName = sClassName; };

  Base * Create() {
    if(msClassName == "DerivedA") {
      return new DerivedA();
    }
    else if(msClassName == "DerivedB") {
      return new DerivedB();
    }
    // etc...
  };

private:
  string msClassName;
};
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini memerlukan menyatakan secara eksplisit setiap kelas terbitan dalam BaseFactory, yang boleh menjadi menyusahkan apabila bilangan kelas terbitan bertambah.

Penyelesaian:

Tidak seperti dalam bahasa seperti C#, C tidak semestinya menyediakan mekanisme untuk mencipta objek secara dinamik berdasarkan maklumat jenis masa jalan. Untuk mencapai kefungsian yang serupa, seseorang boleh mempertimbangkan untuk membina pemetaan antara nama kelas dan fungsi penciptaan objek:

template<typename T> Base * createInstance() { return new T; }

typedef std::map<std::string, Base*(*)()> map_type;

map_type map;
map["DerivedA"] = &createInstance<DerivedA>;
map["DerivedB"] = &createInstance<DerivedB>;
Salin selepas log masuk

Menggunakan peta ini, instantiasi objek menjadi:

return map[some_string]();
Salin selepas log masuk

Sebagai alternatif, seseorang boleh mendaftar memperoleh kelas secara automatik semasa pemulaan program:

template<typename T>
struct DerivedRegister : BaseFactory { 
    DerivedRegister(std::string const& s) { 
        getMap()->insert(std::make_pair(s, &createT<T>));
    }
};

// in derivedb.hpp
class DerivedB {
    ...;
private:
    static DerivedRegister<DerivedB> reg;
};

// in derivedb.cpp:
DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
Salin selepas log masuk

Pendekatan ini menghapuskan keperluan untuk pendaftaran kelas manual, kerana ia berlaku secara automatik apabila kelas ditakrifkan.

Ringkasan:

Walaupun C tidak secara langsung menyokong instantiasi objek daripada rentetan nama kelas, teknik ini menyediakan cara untuk mencapai kefungsian yang serupa dengan memetakan nama kelas kepada fungsi penciptaan objek atau dengan mengautomasikan proses pendaftaran.

Atas ialah kandungan terperinci Bolehkah C Menghidupkan Objek daripada Rentetan Nama Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan