2015-10-13 74 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比询问所需的所有参数要清楚得多。

另外考虑可修改性:在重构过程中,您不需要更改此方法签名,而只需更改基础数据结构。我发现这在协同工作时特别有用,其中有人指定接口并且有人需要实现它。