如何通过字符串动态调用类函数

时间:2019-06-24 23:27:42

标签: c++

我想知道如何动态调用类函数。假设我有一个“狗”类,其中包含函数getname(),该函数返回该特定动物的名称。但是我怎么能这样称呼dog :: getname()函数,但是一开始没有“ dog”,我会使用std :: string animal =“ dog”,然后以某种方式像animal :: getname()

我还没有尝试过任何东西,因为我根本不知道如何获得相似的结果,甚至可能。

class dog {
public:
   static std::string getname() {
      return "Something";
   }
}

class cat {
public:
   static std::string getname() {
      return "Something2";
   }
}

std::string animal = "dog";

现在,以某种方式调用与字符串中的动物相关的getname函数。

2 个答案:

答案 0 :(得分:1)

您是否正在寻找多态性?

#include <memory>
#include <string>

// An animal interface for all animals to implement
class Animal {
public:
    virtual ~Animal() = default;

    virtual std::string getName() const = 0;
};

// An implementation of the animal interface for dogs
class Dog final : public Animal {
public:
   std::string getName() const override {
      return "John";
   }
};

// An implementation of the animal interface for cats
class Cat final : public Animal {
public:
   std::string getName() const override {
      return "Angelina";
   }
};

int main() {
    std::unique_ptr<Animal> animal0 = std::make_unique<Dog>();
    std::unique_ptr<Animal> animal1 = std::make_unique<Cat>();
    // You can pass around a std::unique_ptr<Animal> or Animal *
    // just as you would pass around a string.
    // Although, std::unique_ptr is move-only
    std::cout << animal0->getName() << '\n';
    std::cout << animal1->getName() << '\n';
}

答案 1 :(得分:0)

C ++本身不提供反射,这使您可以轻松地进行反射-在编译过程中会删除类名。

如果您确实要基于字符串名称调用不同的函数,则必须存储从名称到函数指针的映射,并使用它来调用所需的函数。

根据您的特定用例,您可以手动执行此操作(请参阅Using a STL map of function pointers),也可以使用已经链接到How can I add reflection to a C++ application?

的线程中的更复杂的解决方案。