登錄 |創建賬號 |找回密碼
查看: 80|回復: 0

c++11根据字符串去实例化类[编译时确定]

[複製鏈接]

23

主題

6

回帖

128

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
128
發表於 2024-3-26 08:53:34 | 顯示全部樓層 |閱讀模式
在C++11中,没有直接的语言支持来根据字符串名称实例化类。不过,你可以通过几种设计模式和技术来达到这个目的,其中工厂模式是最常用的一种。下面是一个基于工厂模式的简单示例,演示如何根据字符串来实例化不同的类。
首先,定义一个基类和几个派生类:
  1. #include <iostream>
  2. #include <memory>
  3. #include <unordered_map>
  4. #include <string>
  5. #include <functional>

  6. class Animal {
  7. public:
  8.     virtual void speak() = 0; // 纯虚函数,用于在派生类中实现
  9.     virtual ~Animal() {}
  10. };

  11. class Cat : public Animal {
  12. public:
  13.     void speak() override {
  14.         std::cout << "Meow" << std::endl;
  15.     }
  16. };

  17. class Dog : public Animal {
  18. public:
  19.     void speak() override {
  20.         std::cout << "Woof" << std::endl;
  21.     }
  22. };
複製代碼
接下来,实现一个简单的工厂来根据字符串名称实例化相应的类。这个工厂使用一个映射(map)来关联字符串和创建对象的函数。
  1. class AnimalFactory {
  2. public:
  3.     static std::unique_ptr<Animal> createAnimal(const std::string& name) {
  4.         auto it = creators().find(name);
  5.         if (it != creators().end()) {
  6.             return it->second(); // 调用创建函数
  7.         }
  8.         return nullptr; // 如果没有找到对应的创建函数,返回nullptr
  9.     }

  10.     template<typename T>
  11.     static void registerAnimal(const std::string& name) {
  12.         creators()[name] = []() -> std::unique_ptr<Animal> { return std::make_unique<T>(); };
  13.     }

  14. private:
  15.     // 返回静态局部变量的引用,用于存储名字到创建函数的映射
  16.     static std::unordered_map<std::string, std::function<std::unique_ptr<Animal>()>>& creators() {
  17.         static std::unordered_map<std::string, std::function<std::unique_ptr<Animal>()>> instance;
  18.         return instance;
  19.     }
  20. };
複製代碼
然后,在程序开始时注册你的类:
  1. int main() {
  2.     // 注册类
  3.     AnimalFactory::registerAnimal<Cat>("cat");
  4.     AnimalFactory::registerAnimal<Dog>("dog");

  5.     // 根据字符串创建对象
  6.     auto cat = AnimalFactory::createAnimal("cat");
  7.     if (cat) cat->speak(); // 输出: Meow

  8.     auto dog = AnimalFactory::createAnimal("dog");
  9.     if (dog) dog->speak(); // 输出: Woof

  10.     return 0;
  11. }
複製代碼
在上面的例子中,AnimalFactory类使用了静态成员函数和一个静态的unordered_map来存储字符串到对象创建函数的映射。这允许你根据字符串动态地创建Animal类的实例。注意,这个例子使用了C++11的std::unique_ptr智能指针来管理对象的生命周期,以及std::function来存储通用的函数对象。
请记住,这只是一种实现方式,实际上你可以根据项目需求调整设计。
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 創建賬號

本版積分規則

Archiver|手機版|小黑屋|九派社區 ( 苏ICP备07501547号-12 )

GMT+8, 2024-5-17 09:27 , Processed in 0.070659 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表