2017-06-06 76 views
2

我有一個類的指針數組,獲取動態分配在構造函數中。這個類也有一個函數來填充數組。填充功能指針陣列

HolderClass::HolderClass(int number) 
{ 
    arrayOfPointers = new ItemClass*[number]; 
} 

HolderClass::addItem(int number, ItemClass item) 
{ 
    arrayofPointers[number] = &item; 
} 

即使這將彙編我的理解在正確的我真的被填充與懸擺指針數組,因爲該項目變量的生命週期只爲的addItem函數的時間?

將指針傳遞到項目中的指針填充arrayOfPointers的正確方法是什麼?這裏的一個複雜性是將會有子類的ItemClass被傳遞給addItem函數,所以我不相信可以使用默認的拷貝構造函數。

編輯:此代碼是爲了一個Arduino,所以我相當有限的什麼可以和不能做。這也意味着我想簡單地爲這個類的用戶保留一些東西(因爲有很多Arduino新手)並且不要求它們傳遞一個指向addItem函數的指針(這將要求他們管理傳遞的生命在ItemClass對象中)。

回答

0

將指針傳遞給項目的指針填充arrayOfPointers的正確方法是什麼?

首先,不要使用原始的newdelete。使用容器和智能指針。

struct HolderClass 
{ 
    std::unique_ptr<std::unique_ptr<ItemClass>[]> arrayOfPointers; 
    // ... 
}; 

HolderClass::HolderClass(int number) 
{ 
    arrayOfPointers = std::make_unique<std::unique_ptr<ItemClass>[]>(number); 
} 

然後將指針傳遞給addItem,而不是一個值,以避免對象切片和壽命的問題:「用的容器和智能指針」

HolderClass::addItem(int number, std::unique_ptr<ItemClass> item) 
{ 
    arrayofPointers[number] = std::move(item); 
} 
+0

那爲什麼不使用'std :: vector'呢? – Albjenow

+1

默認情況下,矢量在Arduino上也不可用。您可以通過第三方庫訪問它,但如果我不必保持代碼大小不變,我寧願不走這條路線。 –

+0

更貼近OP的設計。 –