C++;不同对象的数组?知道如何用java来做吗 我非常熟悉java,在那里我可以创建一个数组来保存多个对象,但是我不知道C++中如何做。

C++;不同对象的数组?知道如何用java来做吗 我非常熟悉java,在那里我可以创建一个数组来保存多个对象,但是我不知道C++中如何做。,java,c++,arrays,object,Java,C++,Arrays,Object,我有6个不同的对象: 网络摄像机数据 超声数据 运动数据 伊穆达塔 GpsData 疾病数据 我需要在一个数组中保存每个的一个实例 在java中,它类似于: ArrayList array = new ArrayList(); array.add(new WebcamData); array.add(new UltrasonicData); 等等 如何在C++中制作类似的数组?< /p> 谢谢使用std::vector: std::向量错误; 误会。推回(苹果); 误会。推回(洋葱); 误会。

我有6个不同的对象: 网络摄像机数据 超声数据 运动数据 伊穆达塔 GpsData 疾病数据

我需要在一个数组中保存每个的一个实例

在java中,它类似于:

ArrayList array = new ArrayList();
array.add(new WebcamData);
array.add(new UltrasonicData);
等等

如何在C++中制作类似的数组?< /p> 谢谢

使用
std::vector

std::向量错误;
误会。推回(苹果);
误会。推回(洋葱);
误会。推回(Bear());
误会。推回(啤酒);
阅读文档:

boost::any
的实现非常简单,这意味着如果不能使用boost库,您可以自己实现它

Stackoverflow上的一个好话题:

    • 使用
      std::vector

      std::向量错误;
      误会。推回(苹果);
      误会。推回(洋葱);
      误会。推回(Bear());
      误会。推回(啤酒);
      
      阅读文档:

      boost::any
      的实现非常简单,这意味着如果不能使用boost库,您可以自己实现它

      Stackoverflow上的一个好话题:


      C++没有内置的无类型容器或任何无类型机制(缺少
      void*
      )。通常的解决方法是使用。这假设这些类型之间确实没有公共基类。如果有,您可以使用指向该基的
      向量

      C++没有内置的无类型容器或任何无类型机制(缺少
      void*
      )。通常的解决方法是使用。这假设这些类型之间确实没有公共基类。如果有,可以使用指向该基的指针的
      向量。

      如果要添加的所有值都是指针,则可以使用空指针:

      std::vector<void *> myVector;
      
      std::vector myVector;
      
      如果要添加的所有值都是指针,则可以使用空指针:

      std::vector<void *> myVector;
      
      std::vector myVector;
      
      我想,如果您需要将一些对象放在同一数组中,这意味着这些对象应该表示一些常见的东西,所以我建议您使用接口,并在将添加到同一列表中的所有类中实现它。在java中,您使用的是对象类,而不是此接口。最后,您的代码如下所示:

      class IMyInterface {
      public:
          virtual ~IMyInterface() {};
          virtual char* getData()=0;
      };
      class WebcamData : IMyInterface {
          /*private stuff*/
      public:
          /*public stuff*/
          virtual char* getData() {/*getData code*/};
          virtual ~WebcamData() {/*destructor code*/};
      }
      
      std::vector< IMyInterface* > _myVector;
      
      类imy接口{
      公众:
      虚拟~IMyInterface(){};
      虚拟字符*getData()=0;
      };
      类网络摄像机数据:IMyInterface{
      /*私人物品*/
      公众:
      /*公共物品*/
      虚拟字符*getData(){/*getData代码*/};
      virtual~WebcamData(){/*析构函数代码*/};
      }
      std::vector\u myVector;
      
      我想,如果您需要将一些对象放在同一数组中,这意味着这些对象应该表示一些常见的东西,所以我建议您使用接口,并在将添加到同一列表中的所有类中实现它。在java中,您使用的是对象类,而不是此接口。最后,您的代码如下所示:

      class IMyInterface {
      public:
          virtual ~IMyInterface() {};
          virtual char* getData()=0;
      };
      class WebcamData : IMyInterface {
          /*private stuff*/
      public:
          /*public stuff*/
          virtual char* getData() {/*getData code*/};
          virtual ~WebcamData() {/*destructor code*/};
      }
      
      std::vector< IMyInterface* > _myVector;
      
      类imy接口{
      公众:
      虚拟~IMyInterface(){};
      虚拟字符*getData()=0;
      };
      类网络摄像机数据:IMyInterface{
      /*私人物品*/
      公众:
      /*公共物品*/
      虚拟字符*getData(){/*getData代码*/};
      virtual~WebcamData(){/*析构函数代码*/};
      }
      std::vector\u myVector;
      
      这里是另一个实现

       #include <iostream>
      
      class KinectDevices 
      {
           public:
            virtual void On(void) {std::cout << "Kinect is on " << '\n';}
            virtual ~KinectDevices() {std::cout << "  is off" << '\n';}
      };
      
      class kinWebcamData: public KinectDevices 
      {
           public: 
            void On(void) {std::cout << "Webcam  is on" << '\n';}
            ~kinWebcamData(void) { std::cout << "Webcam  " << ' ';}
      };
      
      class kinUltrasonicData: public KinectDevices 
      {
           public: 
            void On(void) {std::cout << "Ultrasonics is on" << '\n';}
            ~kinUltrasonicData(void) {std::cout << "Ultrasonic  " << ' ';}
      };
      
      int main(void)
      {
          const int count = 2;
          // create object array
          KinectDevices *particularKinectDeviceFunction[count];
      
          // create instances of WebcamData()  UltrasonicData()  KinectData() 
          kinWebcamData *WebcamData = new kinWebcamData();
          kinUltrasonicData  *UltrasonicData = new kinUltrasonicData();
      
          //put objects into array
          particularKinectDeviceFunction[0] = WebcamData;
          particularKinectDeviceFunction[1] = UltrasonicData;
      
          particularKinectDeviceFunction[0]->On();
          particularKinectDeviceFunction[1]->On();
      
          delete WebcamData;
          delete UltrasonicData;
      
          std::cout<<" \nPress any key to continue\n";
          std::cin.ignore();
      
          return 0;
      
      }
      

      这里是另一个实现

       #include <iostream>
      
      class KinectDevices 
      {
           public:
            virtual void On(void) {std::cout << "Kinect is on " << '\n';}
            virtual ~KinectDevices() {std::cout << "  is off" << '\n';}
      };
      
      class kinWebcamData: public KinectDevices 
      {
           public: 
            void On(void) {std::cout << "Webcam  is on" << '\n';}
            ~kinWebcamData(void) { std::cout << "Webcam  " << ' ';}
      };
      
      class kinUltrasonicData: public KinectDevices 
      {
           public: 
            void On(void) {std::cout << "Ultrasonics is on" << '\n';}
            ~kinUltrasonicData(void) {std::cout << "Ultrasonic  " << ' ';}
      };
      
      int main(void)
      {
          const int count = 2;
          // create object array
          KinectDevices *particularKinectDeviceFunction[count];
      
          // create instances of WebcamData()  UltrasonicData()  KinectData() 
          kinWebcamData *WebcamData = new kinWebcamData();
          kinUltrasonicData  *UltrasonicData = new kinUltrasonicData();
      
          //put objects into array
          particularKinectDeviceFunction[0] = WebcamData;
          particularKinectDeviceFunction[1] = UltrasonicData;
      
          particularKinectDeviceFunction[0]->On();
          particularKinectDeviceFunction[1]->On();
      
          delete WebcamData;
          delete UltrasonicData;
      
          std::cout<<" \nPress any key to continue\n";
          std::cin.ignore();
      
          return 0;
      
      }
      

      如果不提到boost::variant,我认为答案是不完整的

      你可以用

      typedef boost::variant<WebcamData,UltrasonicData,KinectData,ImuData,GpsData,SickData> Data
      
      typedef boost::变量数据
      
      然后将它们保存在
      std::vector


      然后,您可以使用访问者以非常类型安全的方式处理元素。

      如果不提及boost::variant,我认为答案是不完整的

      你可以用

      typedef boost::variant<WebcamData,UltrasonicData,KinectData,ImuData,GpsData,SickData> Data
      
      typedef boost::变量数据
      
      然后将它们保存在
      std::vector


      <>你可以用非常安全的方式使用访问者来处理元素。

      我会认为这是一个讨厌的东西。即使在java中,我也会觉得这是一种憎恶。即使是在Java中,提示您需要boost库也很好。在某些上下文中,这是一个很好的答案,但在这里,他的所有内容都称为
      *data
      。看起来他需要一个接口。@MooingDuck:一切最终都是数据;在我的例子中,甚至连洋葱和熊都是数据。在这个问题上,他的数据似乎是不相关的,并且没有太多的信息可以让我给出更好的答案。我认为他们似乎是数据源,并且会有类似的接口。如果不是,那么答案的另一部分是它们不属于同一个容器。一个提示可能很好,您需要boost库来实现这一点。在某些上下文中,这是一个很好的答案,但在这里,他的所有内容都称为
      *data
      。看起来他需要一个接口。@MooingDuck:一切最终都是数据;在我的例子中,甚至连洋葱和熊都是数据。在这个问题上,他的数据似乎是不相关的,并且没有太多的信息可以让我给出更好的答案。我认为他们似乎是数据源,并且会有类似的接口。如果不是,那么答案的另一部分是它们不属于同一个容器。+1多态性的经典案例。它们都被称为xxxData,它们很有可能都来自一个类,您可以将共享的ptr存储在一个向量中。+1多态性的经典案例。它们都被称为xxxData,很有可能它们都来自一个类,并且你可以将共享的ptr存储在一个向量中。我从来没有见过boost::optional用于此,你能举个例子吗?@juanchopanza optional,any,variant。有时候事情会搞混。我从没见过boost::