C++ 根据C+中的外部输入选择类+;
在我的程序中,我有几个不同的类,其中包含一个名称相同但输出不同的函数:C++ 根据C+中的外部输入选择类+;,c++,templates,C++,Templates,在我的程序中,我有几个不同的类,其中包含一个名称相同但输出不同的函数: #include <iostream> #define CLASS_TO_USE C class A{ public: std::string class_name = "Class A"; A() {}; double add(const double a, const double b) const { return a + b; } }
#include <iostream>
#define CLASS_TO_USE C
class A{
public:
std::string class_name = "Class A";
A()
{};
double add(const double a, const double b) const
{
return a + b;
}
};
class B{
public:
std::string class_name = "Class B";
B()
{};
double add(const double a, const double b) const
{
return 2 * a + b;
}
};
class C{
public:
std::string class_name = "Class C";
C()
{};
double add(const double a, const double b) const
{
return 3 * a + b;
}
};
template <class T>
void calculate_addition(const T &local_class, const double a, const double b)
{
std::cout << "Addition gives the value " << local_class.add(a, b) << '\n';
}
int main()
{
CLASS_TO_USE local_class;
std::cout << "Hello World!" << std::endl;
calculate_addition(local_class, 2, 3);
return 0;
}
这里有一个后续问题:您可以根据整数用户输入进行调度,例如:
int choice;
std::cin >> choice;
switch (choice)
{
case 1:
calculate_addition(A(), 2, 3);
break;
case 2:
calculate_addition(B(), 2, 3);
break;
case 3:
default:
calculate_addition(C(), 2, 3);
}
相同的签名,不同的主体:Inheritance运行时的答案是使用Inheritance:基类中的虚拟方法。您需要一个switch语句或类似语句来选择要构造的类,但随后使用基类指针引用它。@RichardCriten:那么,创建一个包含所有函数的基类,从中派生子类,然后我可以使用指向基类的指针,用派生类填充它?是的。您还可以传入一个命令行参数,说明要创建哪个派生类,并如@GemTaylor所说,使用switch语句来实现实例化。@Ben:这个示例应该是我问题的一个简单版本,在我的实际代码中,每个类包含大约30个不同的函数进行计算。因此,我不确定你的方法是否有效,如果类只包含一个或两个函数,那么效果会很好,因为大约30个,它变得有点混乱,我想…嗯,我不明白为什么成员函数的数量会增加复杂性?!类的数量不是交换机调度有多丑陋的原因吗?也许我误解了什么,你的意思是要创建一个名为
calculate\u addition(choice,a,b)
的新函数吗?不,代码片段宁愿进入主函数。好的,我想它可以工作,但不幸的是在我的程序中没有。不过,继承也会。谢谢
int choice;
std::cin >> choice;
switch (choice)
{
case 1:
calculate_addition(A(), 2, 3);
break;
case 2:
calculate_addition(B(), 2, 3);
break;
case 3:
default:
calculate_addition(C(), 2, 3);
}