2012-01-23 49 views
1

我非常習慣於Java,我可以創建一個ArrayList來存放多個對象,但我不知道如何在C++中執行它。不同對象的C++數組?知道如何在java中執行它

我有6個不同的對象: WebcamData UltrasonicData KinectData ImuData GpsData SickData

我需要在一個陣列中以保持每個的一個實例。

在java中它會像:

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

等等

我怎樣才能使C++類似的陣列?

謝謝

+6

我會認爲這是一種憎惡。即使在Java中。 – pmr

回答

11

使用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庫,您可以自己實現它。

一個好的題目在#1:

+0

提示可能很好,您需要增強庫。 –

+0

在某些情況下,這是一個很好的答案,但在這裏,他所有的東西被稱爲'* data'。看起來他需要一個界面。 –

+1

@MooingDuck:最後一切都是數據;即使在我的例子中,「洋蔥」和「熊」都是數據。在這個問題中,他的數據似乎是不相關的,我沒有太多的信息可以用來給出更好的答案。 – Nawaz

2

C++沒有附帶一個內置的無類型的容器或任何無類型機構(短的void*)。通常的解決方案是使用boost::any。這假定這些類型之間確實沒有公共基類。如果有,您可以使用指向該基地的vector

+0

我從來沒有見過boost ::可選用於此,你會有一個例子嗎? – juanchopanza

+0

@ juanchopanza可選,任何變體。事情有時會混淆。 – pmr

-1

如果將所有值相加是指針,你可以使用一個空指針:

std::vector<void *> myVector; 
+0

絕對不是大多數情況下的正確答案。 –

4

我想,如果你需要把一些物體在同一陣列,這意味着這些對象應該代表共同的東西在,所以我建議你使用接口並在所有類中實現它,這些類將被添加到同一個列表中。在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; 
+0

+1多態性的經典案例。它們都稱爲xxxData,它們都可以從一個類中派生出來,並且可以將shared_ptrs存儲在一個向量中。 – pezcode

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; 

} 

輸出:

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


Press any key to continue 
0

我不認爲答案將是不完整提的boost ::變種。

你可以使用

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

,然後讓他們在一個std::vector<Data>

然後,您可以使用處理遊客非常類型安全方式的元素。

相關問題