C ++ массив разных объектов?Знать, как это сделать в Java - PullRequest
1 голос
/ 23 января 2012

Я очень привык к Java, где я могу создать ArrayList для хранения нескольких объектов, но я не знаю, как это сделать в C ++.

У меня есть 6 различных объектов: WebcamData UltrasonicData KinectData ImuData GpsData SickData

Мне нужно хранить экземпляр каждого в одном массиве.

В Java это будет выглядеть так:

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

и т.д ...

Как создать подобный массив в C ++?

Спасибо

Ответы [ 6 ]

11 голосов
/ 23 января 2012

Использование std::vector<boost::any>:

std::vector<boost::any> miscArray;
miscArray.push_back(Apple());
miscArray.push_back(Onion());
miscArray.push_back(Bear());
miscArray.push_back(Beer());

Прочитайте документацию:

Реализация boost::any очень проста, что означает, что вы можете реализовать ее самостоятельно, если не можете использовать библиотеку Boost.

Хорошая тема в Stackoverflow:

4 голосов
/ 23 января 2012

Я предполагаю, что если вам нужно поместить несколько объектов в один и тот же массив, это означает, что эти объекты должны представлять что-то общее, поэтому я предлагаю вам использовать интерфейс и реализовать его во всех ваших классах, которые будут добавлены в один и тот же список,В Java вместо этого интерфейса у вас есть класс Object.Итак, в конечном итоге ваш код будет выглядеть так:

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;
2 голосов
/ 23 января 2012

C ++ не поставляется со встроенным контейнером без типов или любым механизмом без типов (если не считать void*). Обычное решение - использовать boost :: any . Это предполагает, что действительно нет общего базового класса между этими типами. Если есть, вы можете использовать vector указателей на эту базу.

0 голосов
/ 26 января 2012

Я не думаю, что ответы будут полными без упоминания boost :: option.

Вы можете использовать

typedef boost::variant<WebcamData,UltrasonicData,KinectData,ImuData,GpsData,SickData> Data

, а затем оставить их в std::vector<Data>

После этого вы можете обрабатывать элементы с использованием посетителей очень безопасным способом.

0 голосов
/ 23 января 2012

Вот еще одна реализация.

 #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;

}

Выход:

Webcam  is on
Ultrasonics is on
Webcam     is off
Ultrasonic     is off


Press any key to continue
0 голосов
/ 23 января 2012

Если все значения, которые вы добавите, являются указателями, вы можете использовать пустой указатель:

std::vector<void *> myVector;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...