在我的程序中,我有几个不同的类,其中包含一个同名但输出不同的函数:
#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/