對于我的專案,我需要ComplicatedClass在陣列中存盤指向型別物件的指標。該陣列Storage與我在此處省略的其他資訊一起存盤在一個類中。
這是我想要做的(這顯然不起作用,但希望能解釋我想要實作的目標):
class ComplicatedClass
{
...
}
class Storage
{
public:
Storage(const size_t& numberOfObjects, const std::array<ComplicatedClass *, numberOfObjects>& objectArray)
: size(numberOfObjects),
objectArray(objectArray)
{}
...
public:
size_t size;
std::array<ComplicatedClass *, size> objectArray;
...
}
int main()
{
ComplicatedClass * object1 = new ComplicatedClass(...);
ComplicatedClass * object2 = new ComplicatedClass(...);
Storage myStorage(2, {object1, object2});
...
return 0;
}
我正在考慮的是:
- 使用
std::vector代替std::array. 我想避免這種情況,因為我的程式的某些部分不允許在空閑存盤上分配記憶體。據我所知,std::vector必須這樣做。作為一個加號,我可以放棄size。 - 更改
Storage為類模板。我想避免這種情況,因為那樣我的代碼中到處都是模板。這并不可怕,但它會使使用的類的Storage可讀性低得多,因為它們還必須具有模板化函式。
我還缺少其他任何選項嗎?
uj5u.com熱心網友回復:
如何傳遞和存盤包含指向物件的指標的可變大小陣列?
通過動態創建物件。最方便的解決方案是使用std::vector.
size_t size; std::array<ComplicatedClass *, size> objectArray;
這是行不通的。模板引數必須是編譯時常量。非靜態成員變數不是編譯時常量。
- 我想避免這種情況,因為我的程式的某些部分不允許在空閑存盤上分配記憶體。據我所知, std::vector 必須這樣做。
std::vector不一定需要使用免費商店。像所有標準容器(除了std::array)一樣,std::vector接受一個分配器。如果您實作了一個不使用 free-store 的自定義分配器,那么您的要求就可以得到滿足。
或者,即使您確實使用了默認分配器,您也可以以這樣的方式撰寫您的程式,即僅在程式中允許從自由存盤分配的部分中將元素插入到向量中。
我認為 C 有“自由存盤”而不是堆,不是嗎?
這些只是同一件事的不同詞。“免費存盤”是 C 中使用的術語。它通常被非正式地稱為“堆記憶體”,因為“堆”是一種有時用于實作它的資料結構。
uj5u.com熱心網友回復:
從 C 11 開始,std::vector有data()訪問向量用于存盤的底層陣列的方法。
在大多數情況下, astd::vector可以類似于陣列使用,允許您在需要時利用大小調整容器質量,std::vector或者在需要時將其用作陣列。見https://stackoverflow.com/a/261607/1466970
最后,您知道可以使用向量代替陣列,對嗎?即使函式需要 c 樣式陣列,您也可以使用向量:
vector<char> v(50); // Ensure there's enough space strcpy(&v[0], "prefer vectors to c arrays");
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390706.html
上一篇:洗掉陣列中重復的連續值
下一篇:回圈中的準備陳述句
