2012-12-31 76 views
0

我想存儲數組或矢量中的各種不同類型的數據。到目前爲止,我正在通過使用基類來完成這一任務,該基類將作爲指向每個對象的指針存儲在向量中,然後鍵入cast以獲取數據。這對int很有用,但其他任何類型的數據都會引發訪問衝突異常。存儲各種類型的載體

很抱歉,如果我的解釋是不是很好,這是我帶註釋的代碼,我希望能幫助:

//Base class 
class MenuProperty 
{ 
private: 
    std::string Name; 

public: 
    MenuProperty(std::string Name) : Name(Name) {}; 
    ~MenuProperty() {}; 

    std::string GetName(); 

}; 

//Typed class used to store data 
template<class T> 
class TMenuProperty : public MenuProperty 
{ 
private: 
    T Data; 

public: 
    TMenuProperty(std::string Name, T Data) : MenuProperty(Name), Data(Data) {}; 

    T GetData() 
    { 
     return this->Data; 
    } 
}; 

//Class with no type and data pointer to retrieve data 
class cpMenuProperty : public MenuProperty 
{ 
private: 
    VOID* Data; 

public: 
    cpMenuProperty(std::string Name) : MenuProperty(Name) {}; 

    VOID* GetPointer() 
    { 
     return this->Data; 
    } 
}; 

希望這是意義一些外表,這裏是我的測試代碼:

int main() 
{ 
    TMenuProperty<double> fP("Test2", 33.7354); //Create instance of property 

    MenuProperty* fMP = &fP;     //Make a pointer to the object 

    cpMenuProperty* Test;      //Make a pointer to the retrieving 
               //object 

    std::vector<MenuProperty*>    Vec; 
    std::vector<MenuProperty*>::iterator it; 

    Vec.push_back(fMP);       

    it = Vec.begin(); 

    Test = static_cast<cpMenuProperty*>(*it); //Cast the first object in the list 
               //list to the same type as the 
               //retrieveing object 


    double Data = *(double*)Test->GetPointer(); //Dereference and access, this is 
               //where the exception is thrown 

    std::cout << Data; 



    int Ret; 
    std::cin >> Ret; 
} 

我可能做一些在這裏巨大的錯誤,但感謝您抽出時間來迄今閱讀:)任何幫助表示讚賞,並提出建設性意見呢!

+0

TMenuProperty fP(「Test2」,33.7354);將其更改爲TMenuProperty * fP = new TMenuProperty fP(「Test2」,33.7354); –

+0

見http://stackoverflow.com/questions/7804955/heterogeneous-containers-in-c – learnvst

回答

2

你初始化棧,你再轉換爲一cpMenuProperty上TMenuProperty對象。沒有任何內存分配給cpMenuProperty中的void * Data。 TMenuProperty和cpMenuProperty之間沒有關係,除了它們來自同一個類。這種設計永遠不會起作用。

  • 擺脫所有的空白*。這是在惹麻煩。
  • 不要使用static_cast <>除非你100%知道你在做什麼。使用dynamic_cast的,它會告訴你的轉換是無效的(我猜你試過,但隨後回落到static_cast迫使代碼至少編譯:))
  • 你爲什麼不使用TMenuProperty一路?這種方法應該可行。
  • 對於其他方式做你在做什麼之後,看看boost :: variant和boost :: any。
  • 如果你是勇敢的和真的知道自己在做什麼(沒有進攻,但我不認爲你有資格獲得此),以及如果數據類型你需要用足夠均勻的內存佈局方面,你也許可以讓你的代碼在正確的內存填充設置下工作,並以某種方式強制內存對齊。然而,我不能想出任何的情況,無論多麼不可能,找到一個這樣做的理由。所以從我可以告訴從這篇文章,我只能建議刪除cpMenuProperty和工作與抽象基類/模板派生類方法只。
+0

好了,理論是強制類型轉換將允許無效*指針落在這是存儲在數據的開始TMenuProperty。感謝您抽出時間來解釋這種方法的弊端。我會重新考慮這個 – Andre

+0

呃,考慮一下,我甚至不需要使用cpMenuProperty的方法。對於浪費時間感到抱歉,在發帖前應該多加考慮。 – Andre

0
#include<iostream> 
#include<vector> 
#include<iterator> 
#include<memory> 
class base { 
public: 
virtual void foo(){ 
     std::cout << "in base" << std::endl; 
    } 
}; 

class derived : public base { 
public: 
virtual void foo(){ 
     std::cout << "in derived" << std::endl; 
    } 
}; 

int main() 
{ 
    std::vector<std::unique_ptr<base>> vec; 
    vec.emplace_back(new derived); 
    static_cast<derived*>(vec[0].get())->foo(); 
    return 0; 
    } 

經典的例子,使用現代的做法。