创建一个变量来保存不同类型的对象C++
Create a variable to hold objects of different types C++
我有 3 个不同的对象A
、B
和 C
。根据给定的参数,我想在这些不同的对象中进行选择。在编程中,
class A {
public:
void printHello() { cout << "HELLO A" << endl; }
};
class B {
public:
void printHello() { cout << "HELLO B" << endl; }
};
class C {
public:
void printHello() { cout << "HELLO C" << endl; }
};
int main () {
string key = "c";
A a;
B b;
C c;
Object obj; // I don't know how to declare Object.
if (key == "a") obj = a;
else if (key == "b") obj = b;
else obj = c;
obj.printHello(); // print Hello C.
return 0;
}
我考虑过模板和结构对象。但到目前为止,它们都不起作用。
template<typename T1, T2, T3>
T1 getType(string key, T1 t1, T2 t2, T3 t3) { // this is problem coz return types are different.
if (key == "a") return t1;
else if (key == "b") return t2;
else return t3;
}
在JAVA
中创建Object o;
很容易,因为 Java 中的每个对象都是Object
类的子类。但是,如何在C++中实现这一目标呢?
编辑。我不能改变班级A
,B
和C
。我得到了这些类来工作,我的目标是实现main
方法。所以,inheritance
对我来说是不可能的。很抱歉有任何困惑。
任何帮助,不胜感激。
您正在寻找variant
类型。C++17 即将推出std::variant
,boost
和网络上的 C++11 兼容版本。 boost::variant
示例:
struct visitor
{
void operator()(const A&){ cout << "HELLO A" << endl; }
void operator()(const B&){ cout << "HELLO B" << endl; }
void operator()(const C&){ cout << "HELLO C" << endl; }
};
int main()
{
visitor v;
// `obj` is either an `A`, a `B` or a `C` at any given moment.
boost::variant<A, B, C> obj{B{}};
// ^^^^^
// Initialize with `B`.
boost::apply_visitor(v, obj); // prints "HELLO B"
obj = A{};
boost::apply_visitor(v, obj); // prints "HELLO A"
}
在我看来
,你应该使用一个虚拟的公共基类/结构和一个指向这个基类/结构的指针。
以下是完整的工作示例
#include <iostream>
struct Base
{ virtual void printHello () = 0; };
class A : public Base {
public:
void printHello() { std::cout << "HELLO A" << std::endl; }
};
class B : public Base{
public:
void printHello() { std::cout << "HELLO B" << std::endl; }
};
class C : public Base{
public:
void printHello() { std::cout << "HELLO C" << std::endl; }
};
int main () {
std::string key = "c";
A a;
B b;
C c;
Base * obj;
if (key == "a") obj = &a;
else if (key == "b") obj = &b;
else obj = &c;
obj->printHello(); // print Hello C.
return 0;
}
你可以做类似的事情
if (key == "a") obj=new A();
else if (key == "b") obj=new B();
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 将类型保存到文件
- std::map 保存任何值类型
- 是否可以在C++变量中保存多种类型的枚举?
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- 更改代码::块上的默认保存文件类型
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- Qt 模型拖放 - 无法保存类型 QJsonValue
- CRTP 模式 但是在数据结构中存储非同构类型
- 从保存变量数据类型的数据结构中检索值,而不指定返回类型
- 将枚举类型保存在位字段 [dcl.enum] [class.bit] 中
- 创建一个变量来保存不同类型的对象C++
- 在编译时检查特征类型保存的数据在内存中是否连续
- 重载 fstream <<运算符以保存"any"类型的数据
- C++在成员变量中保存不同类型数据的优雅方式
- 为什么引用对象仅保存特定类型的引用
- 保存类类型的c++类型