在C++11中,没有直接的语言支持来根据字符串名称实例化类。不过,你可以通过几种设计模式和技术来达到这个目的,其中工厂模式是最常用的一种。下面是一个基于工厂模式的简单示例,演示如何根据字符串来实例化不同的类。 首先,定义一个基类和几个派生类: - #include <iostream>
- #include <memory>
- #include <unordered_map>
- #include <string>
- #include <functional>
- class Animal {
- public:
- virtual void speak() = 0; // 纯虚函数,用于在派生类中实现
- virtual ~Animal() {}
- };
- class Cat : public Animal {
- public:
- void speak() override {
- std::cout << "Meow" << std::endl;
- }
- };
- class Dog : public Animal {
- public:
- void speak() override {
- std::cout << "Woof" << std::endl;
- }
- };
複製代碼接下来,实现一个简单的工厂来根据字符串名称实例化相应的类。这个工厂使用一个映射(map)来关联字符串和创建对象的函数。 - class AnimalFactory {
- public:
- static std::unique_ptr<Animal> createAnimal(const std::string& name) {
- auto it = creators().find(name);
- if (it != creators().end()) {
- return it->second(); // 调用创建函数
- }
- return nullptr; // 如果没有找到对应的创建函数,返回nullptr
- }
- template<typename T>
- static void registerAnimal(const std::string& name) {
- creators()[name] = []() -> std::unique_ptr<Animal> { return std::make_unique<T>(); };
- }
- private:
- // 返回静态局部变量的引用,用于存储名字到创建函数的映射
- static std::unordered_map<std::string, std::function<std::unique_ptr<Animal>()>>& creators() {
- static std::unordered_map<std::string, std::function<std::unique_ptr<Animal>()>> instance;
- return instance;
- }
- };
複製代碼然后,在程序开始时注册你的类: - int main() {
- // 注册类
- AnimalFactory::registerAnimal<Cat>("cat");
- AnimalFactory::registerAnimal<Dog>("dog");
- // 根据字符串创建对象
- auto cat = AnimalFactory::createAnimal("cat");
- if (cat) cat->speak(); // 输出: Meow
- auto dog = AnimalFactory::createAnimal("dog");
- if (dog) dog->speak(); // 输出: Woof
- return 0;
- }
複製代碼在上面的例子中,AnimalFactory类使用了静态成员函数和一个静态的unordered_map来存储字符串到对象创建函数的映射。这允许你根据字符串动态地创建Animal类的实例。注意,这个例子使用了C++11的std::unique_ptr智能指针来管理对象的生命周期,以及std::function来存储通用的函数对象。 请记住,这只是一种实现方式,实际上你可以根据项目需求调整设计。 |