我有一個使用內部對象Builder
實例化複雜對象的構造函數。數據結構中的五個成員是指針類型。但是,使用這種模式時,我遇到了對象被破壞時的問題。下面是我的構造的樣子,與成員初始化列表:在使用Builder模式的構造函數中將指針類型的成員數據初始化爲NULL
Player::Player(const Builder& builder)
:m_name(builder._name)
,m_description(builder._description)
,m_primaryAttributes(builder._primaryAttributes)
,m_abilityAttributes(builder._abilityAttributes)
,m_armor(builder._armor)
,m_weapon(builder._weapon)
,m_inventory(new ComponentMap())
{}
客戶端代碼工作得很好,符合市場預期:
Player* player = Player::Builder()
.name("Dylan")
.description("Super bad-ass hero of the game")
.primaryAttributes(createPrimaryAttributes())
.abilityAttributes(createAbilityAttributes())
.weapon(createWeapon())
.armor(createArmor())
.build();
但是,如果我忽略的一個參數的消息鏈,然後摧毀我Player
對象,壞的事情發生:
Player* player = Player::Builder()
.name("Dylan")
.description("Super bad-ass hero of the game")
.primaryAttributes(createPrimaryAttributes())
.abilityAttributes(createAbilityAttributes())
.armor(createArmor())
.build();
// ...
delete player;
// ...
// cleanMemory() gets called in Player::~Player()
void Player::cleanMemory()
{
if(m_primaryAttributes != NULL)
delete m_primaryAttributes;
if(m_abilityAttributes != NULL)
delete m_abilityAttributes;
if(m_inventory != NULL)
delete m_inventory;
if(m_weapon != NULL) // oops, bad stuff happens here
delete m_weapon;
if(m_armor != NULL)
delete m_armor;
}
顯然,出現這種情況是因爲指針武器沒有得到初始化要麼NULL
或Weapon
對象的實例。在鏈中省略了一個Builder
方法的情況下,該構造函數也不會允許缺省爲NULL
(至少從我所能看到的情況來看)。目前,客戶必須給Weapon
一個指向NULL
的指針或一個對象的實例。
是否有任何可能的方式來解決這個問題而不完全修改這個Builder
構造函數?或者,是否應該使用另一種模式重構,如Factory
,然後回到帶位置參數列表的常規構造函數?
請向我們展示'Player :: Builder'函數? – billz
使用smartpointers? –
我的第一個想法是智能指針。這將完全消除cleanMemory()。 – drescherjm