2015-10-13 31 views
4

有人認爲使用類或結構來傳遞參數有好處嗎?C++使用結構參數而不是多個參數?

等代替

f(int,float,string) 

f(Args) 

哪裏Argsstructintfloatstring成員。

優點是易於創建多個默認參數並沒有改變函數簽名時,新的論據增加。

回答

1

有人認爲使用類或結構傳遞參數有優勢嗎?

是的,我覺得有一個很大的優勢。

功能上的大參數列表會分散客戶端代碼與語義參數一致性,這可以在適當的structclass內更好地管理。

而且它更靈活地使用struct,如果附加的(可能是可選的)參數需要在以後添加。

1

明顯的好處是有語義相關數據項的邏輯分組。

一旦你這樣做,加上將保證你的不變量結構的一些(成員)操作。

封裝提高代碼的抽象級別,這使得它更容易維護/推理。

又見Law Of Demeter

1

我也想利用結構是較好的:你可以用參數類型和順序繞過喧囂。假設您有foo(A, B)(對於類型AB)。但仍然foo(b, a)可能會編譯,這取決於隱含的結構等。

此概念也可以使用某種Context類推廣。依靠C++ 11 variadic模板,您可以將「參數超集上下文」傳遞給子集。

1

是否使用包含在類/結構中的一個參數或多個參數取決於參數的含義。

不好用一個結構:

struct Foo 
{ 
    char const* source; 
    char* destination; 
}; 


Foo strcpy(Foo foo); 

用好一個結構:的

struct Point 
{ 
    int x; 
    int y; 
}; 


int distanceFromOrigin(Point p) { ... } 

代替

int distanceFromOrigin(int x, int y) { ... } 
1

在這裏做魔鬼代言人。這裏也有缺點,主要是語義上的。首先,如果其中一些參數是通過引用傳遞的,另一個通過常量引用,第三個通過const指針和第四個參數傳遞,則需要很多代碼。將要求你明確地寫出參數struct的移動構造函數和默認構造函數,這將很快變得乏味。將成員添加到該結構中也很繁瑣。

1

我認爲最大的優點是不必依賴於參數順序。依賴順序是容易出錯的,如果你經常改變接口,而改變參數結構,你總是明確地賦值給具有特定語義的成員變量。

例如Direct3D11 ID3D11Device::CreateDepthStencilState功能:傳遞const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc比詢問所需的所有參數要清楚得多。

另外考慮可修改性:在重構過程中,您不需要更改此方法簽名,而只需更改基礎數據結構。我發現這在協同工作時特別有用,其中有人指定接口並且有人需要實現它。