2012-03-23 17 views
0

我有什麼:

我使用的指針每個結構不同的自定義結構(每個矢量一個自定義的結構)的 載體給它每記錄一個靜態的大小
是通過指針每
當我嘗試將指針轉換爲它在每個迭代上
我的解決方法失敗自定義矢量組合這些向量的向量是對函數的調用了一個向量指針作爲參數和返回一個void指針。
我知道這是錯誤的,儘管功能,但我找不到正確的方式來定義正確的投射方法的參考。如何的方法從子類用C添加到超++

我正在尋找正確的方法來完成此操作。

 
typedef struct mystruct { 
    DWORD something; 
    vectorclassa * somethinga; 
    vectorclassb * somethingb; 
    }; 

typedef std::vector&ltmystruct*> amystruct; 
void * theWrongWay(mystruct * apointer){ 
    return apointer; 
} 

typedef std::vector bigvector; 

如果我嘗試bigvector.push_back(& instance_of_amystruct)
它失敗。如果我將std::vector<amystruct*> bigvector更改爲void *並將其稱爲「錯誤路由」,則會編譯/運行。這似乎是錯誤的。

問題是我不知道如何定義向量的缺失方法或將其轉換爲某個向量知道如何處理而不做某事......不好。

+0

顯示一些代碼。 – 2012-03-23 23:03:56

+0

代碼併發布你想要做的事情的緊湊,重點最少的演示。 – Robinson 2012-03-23 23:09:15

+0

你可以使用'void *'在容器中保存不同的類型,但這是使用它的最糟糕的方式。在安全方法中,boost :: any是最通用的方法。最好的方法取決於你打算如何處理這些容器。 – enobayram 2012-03-23 23:17:06

回答

2

這個問題很難回答,因爲很難說出爲什麼要這樣做。爲什麼你想保持不同類型的向量在另一個向量?

無論如何,我只是假設你想這樣做,因爲你想對每個矢量採取一些常見的操作。然後,您可以簡單地定義一個定義該操作的抽象類,並根據模板參數使該類的模板化子類保留不同的矢量。然後,您可以將這些向量保存在一個容器中,並將它們稱爲它們的共同祖先。有些代碼:

class ActionableVector { 
    virtual void doSuperCoolStuff() = 0; 
} 

template<typename T> 
class VectorHandler: public ActionableVector { 
    vector<T> handledVector; 
    // vector<T> & handleVector; // You can keep a reference to an external vector too 
    virtual void doSuperCoolStuff() { 
     //do super cool stuff in a type-safe manner 
    } 
} 

template<> 
class VectorHandler<ATypeThatNeedsSpecialAttention>: public ActionableVector { 
    Vector<ATypeThatNeedsSpecialAttention> handledVector; 
    virtual void doSuperCoolStuff() { 
     // Do especially cool stuff 
    } 

vector<ActionableVector*> myVectors; 

for(ActionableVector * av: myVectors) { //C++ 11 yaay 
    av->doSuperCoolStuff(); 
} 

如果你真的真的真的想保持完全不同類型的對象在一個容器中,並願意出賣自己的靈魂給魔鬼的是,看this答案。

相關問題