我想知道如何动态调用类函数。假设我有一个“狗”类,其中包含函数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函数。
答案 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?
的线程中的更复杂的解决方案。