我對 C 相當陌生。
有一個Bbox帶有兩個引數的建構式的結構x,y我剛剛添加了它。在建構式沒有引數之前,我可以Bbox通過這樣做來啟動多個實體,并且num_components是我想要創建的實體數:
Bbox list [num_components];
但是,當建構式需要引數時,我現在該怎么做呢?
struct Bbox {
int
left,
top,
right = 0,
bottom = 0,
mat_width,
mat_height;
Bbox(int x, int y):
left(std::numeric_limits<int>::max()),
top(std::numeric_limits<int>::max()),
mat_width(x),
mat_height(y)
{}
};
啟動串列的引數Bbox總是相同的。可以說x=10,y=20但不想將默認值添加到建構式,因為值可能會有所不同
uj5u.com熱心網友回復:
而且,以@anoop 的(優秀)答案為基礎,如果您使用std::vector而不是 C 風格的陣列(并且您應該這樣做!),那么您可以這樣做:
std::vector <Box> make_boxes (int num_boxes)
{
return std::vector <Box> (num_boxes);
}
你會這樣稱呼它:
auto my_boxes = make_boxes (10);
但make_boxes它是如此微不足道,以至于幾乎不值得考慮它,真的。
如果你想make_boxes構造呼叫者指定大小的盒子,那么這將完成這項作業:
std::vector <Box> make_boxes (int num_boxes, int x, int y)
{
std::vector <Box> boxes;
boxes.reserve (num_boxes);
for (int i = 0; i < num_boxes; i)
boxes.emplace_back (x, y);
return boxes;
}
進而:
auto boxes = make_boxes (10, 10, 20);
uj5u.com熱心網友回復:
啟動 Bbox 串列的引數始終相同。假設 x=10 和 y=20
您可以添加一個默認建構式,通過傳遞引數將作業委托給引數化建構式10,20如下所示:
struct Bbox{
//other parameterized constructor as before
//----------vvvvvvvvvvv------>delegate the work to parameterized ctor
Bbox(): Bbox(10, 20) //this is a default ctor delegating the work to the other ctor
{
}
};
Bbox list[num_components]; //works now assuming num_components is a constant expression
演示
uj5u.com熱心網友回復:
使用花括號初始化陣列:
Bbox list [num_components] = {
// ...
};
然后對于每個Bbox物件,您再次需要花括號:
{ SOME_X, SOME_Y }
結合起來就像:
Bbox list [num_components] = {
{ SOME_X, SOME_Y },
// ...
{ SOME_OTHER_X, SOME_OTHER_Y }
};
如果您希望能夠創建默認構造的Bbox物件,而無需任何顯式初始化,則必須創建Bbox默認建構式。
現在請記住,陣列的大小在編譯時是固定的。在最不需要的時候,它們也傾向于衰減為指標。
如果您需要一個動態“陣列”,其大小在編譯時不必知道,并且您可以在運行時添加或洗掉元素,您應該使用std::vector:
std::vector<Bbox> list;
您可以像對陣列一樣對其進行初始化,或者稍后在需要時添加元素:
list.emplace_back(some_x, some_y);
由于向量是一個“物件”,因此將其副本傳遞給函式也很容易,或者如果其中有很多元素,則傳遞參考也很容易。它跟蹤自己的大小,您可以輕松地回圈遍歷向量,并使用標準庫中提供的許多不錯的演算法。好吧,您可以使用陣列甚至指標來做到這一點,但使用向量更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472985.html
標籤:C
