2013-05-21 95 views
0

我想用C++來做這樣的事情。cpp將對象存儲在一個指針數組中

void showContensofArray(void *data[]) 
{ 
     //In this function have to display the values of respective objects. 
     // Any ideas how do I do it? 
} 
int main(){ 
    A phew(xxx,abcdefg); //object of class A 

    B ball(90),ball2(88); //object of class B 

    void *dataArray[2]; 
    dataArray[0] = &ph1; 
    dataArray[1] = &ball; 
    showContentsofArray(dataArray); //function 
} 

回答

0
void showContensofArray(void *data[], int len) 
{ 
    int i; 
    for(i=0;i<len;i++){ 
     ((Base*)(data[i]))->print(); 
    } 
} 

而且每類應該有知道如何打印其值的方法print()的實現。

你也可以使用繼承。

編輯:

@ Ricibob的答案是正確的,但如果你需要做的函數內部的鑄造,你需要做的是這樣的:

#include <iostream> 

using namespace std; 

class Base{ 
public: 
    virtual void print()=0; 
}; 
class A: public Base{ 
public: 

    void print(){ 
     cout<<"Object A"<<endl; 
    } 
}; 

class B: public Base{ 
public: 
    void print(){ 
     cout<<"Object B"<<endl; 
    } 
}; 

void showContensofArray(void* data[], int len) 
{ 
    int i; 
    for(i=0;i<len;i++){ 
     ((Base*)(data[i]))->print(); 
    } 
} 

int main(){ 
    A a; 
    B b; 
    void* v[2]; 
    v[0]= &a; 
    v[1] = &b; 
    showContensofArray(v,2); 
    return 0; 
} 

你無法逃避繼承。

+0

我試過這個,它給了我一個錯誤,說'左邊的' - >'必須指向上課,因爲它現在正在引用(void *)....任何想法我要去錯了 –

+0

現在呢? – eLRuLL

+0

showContentsOfArray應該包含一個基類指針NOT array的數組。一般來說,你不需要在C++中處理void ptrs。一旦消除void *並使用基類ptrs和虛函數工作,就不再需要強制轉換,代碼看起來更清晰。如果你應用這個改變,那麼你基本上已經得到了我的答案。 – Ricibob

0

只投回原來的類型:

A* p1 = static_cast<A*>(data[0]); 
B* p2 = static_cast<B*>(data[1]); 
+0

如果我不知道的數組中的內容的順序是什麼。有沒有辦法讓我做個檢查然後再施放?就像在Java中一樣,我可以獲取對象的類名,然後將其轉換回來。有什麼類似的C++ –

+2

如果你想要這樣的東西,我會建議[boost :: variant](http://www.boost.org/doc/libs/1_53_0/doc/html/variant.html)。 –

1

如果你想一般地對待數據[]中的對象(即通過調用它們的通用函數來提取描述或值),然後爲你的對象定義一個類hirachy,並在你的showContentsofArray函數中調用虛擬方法你的(公共基類)對象指針。
這是Polymorphism的一本教科書示例:
「多態性允許使用統一接口處理不同數據類型的值。」
在下面的例子中,基類BaseObject定義了統一接口。

class BaseObject { 
    virtual string description() { return "Base object"; } 
    virtual bool bounces() { return false; } 
} 
class B : public BaseObject { 
    string description() { return "Im a B object" } 
    bool bounces() { return true; } 
} 
class A : public BaseObject { 
    string description() { return "Im an A object" } 
} 

void showContensofArray(BaseObject* data[], int size) { 
    for (int i=0; i<size; i++) { 
     cout << data[i]->description(); 
     if (data[i]->bounces()) 
      cout << "I bounce!"; 
    } 
} 

int main() { 
    A phew(xxx,abcdefg); //object of class A 
    B ball(90),ball2(88); //object of class B 

    BaseObject* dataArray[2]; 
    dataArray[0] = &ph1; 
    dataArray[1] = &ball; 
    showContentsofArray(dataArray); 
} 

將輸出:

Im an A object 
Im a B object 
I bounce! 
相關問題