C++;不同对象的数组?知道如何用java来做吗 我非常熟悉java,在那里我可以创建一个数组来保存多个对象,但是我不知道C++中如何做。
我有6个不同的对象: 网络摄像机数据 超声数据 运动数据 伊穆达塔 GpsData 疾病数据 我需要在一个数组中保存每个的一个实例 在java中,它类似于: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::向量错误; 误会。推回(苹果); 误会。推回(洋葱); 误会。
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上的一个好话题:
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::