c++ - 根据 C++ 中的外部输入选择类

标签 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;
    }
};

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

目前,我通过更改 CLASS_TO_USE 的变量在这些类之间切换,但该方法需要重新编译,这需要一些时间。相反,我更喜欢一种在运行时有效的方法,即我可以使用 f.ex 的地方。来自用户的输入。这可能吗?如果可能,怎么做?

编辑:我使用以下代码解决了这个问题:

#include <iostream>
#include <variant>

class A{
public:
    std::string class_name_string = "Class A";

    A()
    {};

    virtual double add(const double a, const double b) const
    {
        (void) a;
        (void) b;
        return 0;
    };

    virtual std::string class_name(void) const
    {
        return class_name_string;
    }
};

class B : public A{
public:
    std::string class_name_string = "Class B";

    B()
    {};

    double add(const double a, const double b) const
    {
        return 2 * a + b;
    }

    virtual std::string class_name(void) const
    {
        return class_name_string;
    }
};


class C : public A{
public:
    std::string class_name_string = "Class C";

    C()
    {};

    double add(const double a, const double b) const
    {
        return 3 * a + b;
    }

    virtual std::string class_name(void) const
    {
        return class_name_string;
    }
};

class D : public A{
public:
    std::string class_name_string = "Class D";

    D()
    {};

    double add(const double a, const double b) const
    {
        return a + b;
    }

    virtual std::string class_name(void) const
    {
        return class_name_string;
    }
};

void calculate_base_addition(const A &local_class, const double a, const double b)
{
    std::cout << "Addition gives the value " << local_class.add(a, b) << " by using " << local_class.class_name() << '\n';
}

int main()
{
    A *base_class;
    B tmp_class_B;
    C tmp_class_C;
    D tmp_class_D;
    int class_to_choose = 2;
    switch(class_to_choose)
    {
    case 0:
    {
        base_class = &tmp_class_B;
        break;
    }
    case 1:
    {
        base_class = &tmp_class_C;
        break;
    }
    case 2:
    default:
    {
        base_class = &tmp_class_D;
        break;
    }
    }
    std::cout << "Name of base_class: " << (*base_class).class_name() << '\n';
    std::cout << "Name of derived class: " << tmp_class_B.class_name() << '\n';
    std::cout << "Hello World!" << std::endl;
    calculate_base_addition(*base_class, 2, 3);
    return 0;
}

并在这里提出后续问题:Define class variable in class based on user input

最佳答案

您可以根据整数用户输入进行分派(dispatch),例如像这样:

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

关于c++ - 根据 C++ 中的外部输入选择类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358884/

相关文章:

c++ - 寻找 : C/C++ Regex library that supports Named Captures

c++ - Win32 C++代码: AtlThrow vs. STL异常错误处理建议

c++ - 以下模板代码的奇怪行为

c++ - 在编译时迭代检查函数是否存在

c++:需要正确的语法以避免 MISRA 14-6-1 警告。具有依赖基类的类模板

带有指针的 C++ 类模板特化

C++ 从 LPCTSTR 转换为 const char *

c++ - 从缺少列的文件中读取数据。 C++

c++ - 具有 Boost::serialization 的 XML 层次结构

ios - 快速更改 UISlider 图像和色调无法按预期工作