簡體   English   中英

C ++:完整復制指針向量

[英]C++: make full copy of vector of pointers

我正在開發C ++游戲。 我的關卡對象在矢量中(對象是我的關卡對象的超類)。

我需要將此向量的狀態保存在檢查點,並在死亡時檢索。

因此,在關卡開始時,將創建矢量(對象)(old_objects)。

如果單擊檢查點,則將清除old_objects,然后將對象重新復制到old_objects。

如果死了,則來自對象的數據將被擦除,並將old_objects復制回對象。

我一直在嘗試幾種方法來執行此操作,但無法使其正常工作。 救命?

編輯:我嘗試使用虛擬clone()方法。 它拋出超出范圍的錯誤。

class Object {
  public:
    virtual Object* clone() { return new Object(); }
};

class SubObjectA {
  public:
    Object* clone() { return new SubObjectA(datablahblah); }
};

class SubObjectB {
  public:
    Object* clone() { return new SubObjectB(datablahblah); }
};

for (vector<Object*>::iterator it = objects.begin(); it != objects.end(); it++) {
    Object* tempobj = *it;
    old_objects.push_back(tempobj->clone());
}

但是我得到的都是一樣的老:

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

您可以使用Prototype模式,並讓您的Object基類聲明一個純虛擬的clone()方法。 然后在檢查點時間,您只需要遍歷向量,然后在指針上調用clone並將其推入新向量。

這里唯一重要的要求是提供一個深層復制構造函數,該構造函數存儲所有必需的信息(或者,如果不可能的話,該方法將獲取所有必需的信息)。 然后使用該ctor /方法創建第二個向量。 就像是:

class Object
{
    RenderObject * m_Renderable;
    int m_Health;
    float3 m_Position;

    Object(const Object * other) :
       m_Renderable(nullptr),
       m_Health(other->m_Health), 
       m_Position(other->m_Position)
    { };

    Object * GetStorable()
    {
        return new Object(*this);
    }
};

然后存儲“檢查點”,您只需執行以下操作:

vector<vector<shared_ptr<Object>>> gCheckpoints;
vector<shared_ptr<Object>> gLevelObjects;

vector<shared_ptr<Object>> checkpoint;
std::for_each(
    gLevelObjects.begin(), gLevelObjects.end(),
    [&](shared_ptr<Object> obj)
    {
        checkpoint.push_back(obj->GetStorable());
    });
gCheckpoints.push_back(checkpoint); // creates a new checkpoint

還原檢查點后,您將需要為對象重新創建渲染信息。 但是,這是大多數圖形環境中大多數保存系統的要求。

根據Object類的設置方式,您還可以從包含已存儲數據的另一個類繼承,並簡單地存儲該數據並在必要時根據該數據創建可渲染對象( class RenderObject : StoredObject { ... }; )。

您也可以以某種方式(二進制保存,xml,json)序列化對象並將其存儲到文件(自動保存/快速保存/檢查點)或內存中,然后使用常規的加載機制加載該特定文件。

最佳方法取決於您的計划和系統設置,但是此概念應提供基礎知識或為您提供一個起點。

暫無
暫無

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

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