Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据C+中的外部输入选择类+;_C++_Templates - Fatal编程技术网

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);
}