2010-03-28 63 views
4

備選1的C++矢量,重新使用的臨時變量的優選方式矢量內存:填滿結構

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + foreground.x; 
sticker.y = foreground.y; 
sticker.width = foreground.width; 
sticker.height = foreground.height; 
} 

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + outline.x; 
sticker.y = outline.y; 
sticker.width = outline.width; 
sticker.height = outline.height; 
} 

你更喜歡哪種方法?

編輯:爲了討論起見,假定任務必須由構造

回答

16

我選擇的一個外部對其進行一個 - 給貼一個構造函數的參數。然後:

board.push_back(Sticker(outline.x, foo.bar, etc.)); 

編輯:代碼來說明構造函數的參數名:

#include <iostream> 
using namespace std; 

struct S { 
    int a, b; 
    S(int a, int b) : a(a), b(b) { 
    } 
}; 

int main() {  
    S s(1, 2); 
    cout << s.a << " " << s.b << endl; 
} 
+0

我的建議爲好,但我更喜歡'board.push_back(貼紙(輪廓,X)); board.push_back(貼紙(前景,x))'而不是逐一傳遞每個作品。 – 2010-03-28 15:35:06

+0

Ya,在裏面添加一個init列表,並且瞧' – Maciek 2010-03-28 15:43:59

+0

你會怎樣稱呼你的構造函數參數,因爲它們理想地應該和類成員具有相同的名字? – henle 2010-03-28 16:15:17

0

替代1.爲什麼只爲一個變量創建範圍?通常附近有一個封閉的範圍(至少,你應該保持你的函數/程序很小,這樣可以確定它的範圍)。

爲什麼?您可以創建較短的變量名稱,例如st在這種情況下。由於作業將在附近,因此清晰度不應有任何損失。其實它會看起來更簡單,更清潔。另外,如果矢量需要從幾個其他間接級別解除引用/訪問,那麼它也將簡化代碼。

+0

真的嗎?我不介意那麼多。關於範圍設定:如果編寫器寫入一個全新的變量,我認爲編譯器可以更容易地優化臨時程序。 – henle 2010-03-28 15:36:51

+1

@henle不關心編譯器。這些都是非常先進的軟件(只需考慮C++的存在時間),並且可以計算出相當多的東西。範圍是爲你,所以你不會犯錯誤。 – foraidt 2010-03-28 16:36:39

+0

@mxp I ** do **關心編譯器 – henle 2010-03-28 17:36:31

2

board.resize(sticker_count);

然後遍歷所有向量並設置參數。

0

如何的WinForms風格:

// Class members 

Sticker sticker1; 
Sticker sticker2; 
Board board; 

// Initialization 

void InitBoard() 
{ 
    sticker1.x = x + foreground.x; 
    sticker1.y = foreground.y; 
    sticker1.width = foreground.width; 
    sticker1.height = foreground.height; 

    sticker2.x = x + outline.x; 
    sticker2.y = outline.y; 
    sticker2.width = outline.width; 
    sticker2.height = outline.height; 

    // Add to board 
    board.push_back(sticker1); 
    board.push_back(sticker2); 
}