创建一个变量来保存不同类型的对象C++

Create a variable to hold objects of different types C++

本文关键字:保存 同类型 C++ 对象 变量 一个 创建      更新时间:2023-10-16

我有 3 个不同的对象ABC 。根据给定的参数,我想在这些不同的对象中进行选择。在编程中,

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++中实现这一目标呢?

编辑。我不能改变班级ABC。我得到了这些类来工作,我的目标是实现main方法。所以,inheritance对我来说是不可能的。很抱歉有任何困惑。

任何帮助,不胜感激。

您正在寻找variant类型。C++17 即将推出std::variantboost和网络上的 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();