簡體   English   中英

創建一組不同的對象

[英]Creating an array of unlike objects

這是我最后一個問題的跟進,其中我需要一個對象數組,這些對象是一個基類的子類。 建議我嘗試dynamic_cast,但是速度在此項目中非常重要。

這基本上就是我所追求的。

class Object
{
protected:
    int id;
};

class Bike: public Object
{
public:
    bike();

private:
    int bells;
};

class Car: public Object
{
public:
    void drive();

private:
    int wheels;
};

我需要這些對象的數組,所以我決定使用基類。

// Imagine I have 10 objects and don't know what they will be
Object* objects[10];

// Let's make the first object
objects[0] = new Car;

有人告訴我動態轉換是個好主意。 問題在於速度很重要,在某些情況下,我需要執行以下操作:

  1. 汽車8參考索引值為3的一輛自行車。

如果沒有dynamic_casting,還有其他解決方法嗎?

編輯:如果我用一堆子類填充數組,如何在特定索引處訪問子類的數據。 換句話說,假設一輛自行車在索引8處。如何僅通過數組和索引從該對象獲得整數鍾。

這取決於您要執行的其他操作,但是您可以有一個結構數組,用於存儲一個枚舉,該枚舉指定要存儲的對象類型以及對象指針。

IE瀏覽器:

class CObject;

enum EObjectType
{
    OT_Bike,
    OT_Car
};

struct SObjectInfo
{
    EObjectType Type;
    CObject* Object;
};

在遍歷數組時,可以檢查對象的類型,然后將對象指針靜態轉換為適當的派生類型。 我在無法避免的地方廣泛使用了這種方法,並且在通用容器中絕對必須對對象類型進行運行時標識。

但是,為什么不使用多態和虛擬方法就需要將不同類的對象存儲在同一數組中?

如果對象不同,為什么要有基類? 該鏈接可能有幫助: http : //www.codeproject.com/Articles/23304/High-Performance-Heterogeneous-Container

首先,如果您需要非常快的速度,請不要使用new運算符在堆上創建它。 如果可能,您需要在本地創建它們。

如果您確定總會有對象,則可以將強制類型轉換為static_cast,這是一種更快的解決方案。

對我來說,最好的辦法是將接口與純虛方法一起使用。 喜歡:

Class Objects //interface
{
public:
   virtual void ride() = 0;
}

然后使用接口作為基類。 這在編程中很常見。

無論實現的外觀如何,看起來您的問題都需要一些運行時開銷:這是因為程序有時需要確定其實際存儲的類型。 請注意,如果可以負擔得起的話,您可以采用更多替代方法來引入一點人工繼承:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM