有人认为使用类或结构来传递参数有好处吗?C++使用结构参数而不是多个参数?
等代替
f(int,float,string)
有
f(Args)
哪里Args
为struct
与int
,float
,string
成员。
优点是易于创建多个默认参数并没有改变函数签名时,新的论据增加。
有人认为使用类或结构来传递参数有好处吗?C++使用结构参数而不是多个参数?
等代替
f(int,float,string)
有
f(Args)
哪里Args
为struct
与int
,float
,string
成员。
优点是易于创建多个默认参数并没有改变函数签名时,新的论据增加。
有人认为使用类或结构传递参数有优势吗?
是的,我觉得有一个很大的优势。
功能上的大参数列表会分散客户端代码与语义参数一致性,这可以在适当的struct
或class
内更好地管理。
而且它更灵活地使用struct
,如果附加的(可能是可选的)参数需要在以后添加。
我也想利用结构是较好的:你可以用参数类型和顺序绕过喧嚣。假设您有foo(A, B)
(对于类型A
和B
)。但仍然foo(b, a)
可能会编译,这取决于隐含的结构等。
此概念也可以使用某种Context
类推广。依靠C++ 11 variadic模板,您可以将“参数超集上下文”传递给子集。
是否使用包含在类/结构中的一个参数或多个参数取决于参数的含义。
不好用一个结构:
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) { ... }
在这里做魔鬼代言人。这里也有缺点,主要是语义上的。首先,如果其中一些参数是通过引用传递的,另一个通过常量引用,第三个通过const指针和第四个参数传递,则需要很多代码。将要求你明确地写出参数struct的移动构造函数和默认构造函数,这将很快变得乏味。将成员添加到该结构中也很繁琐。
我认为最大的优点是不必依赖于参数顺序。依赖顺序是容易出错的,如果你经常改变接口,而改变参数结构,你总是明确地赋值给具有特定语义的成员变量。
例如Direct3D11 ID3D11Device::CreateDepthStencilState功能:传递const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc
比询问所需的所有参数要清楚得多。
另外考虑可修改性:在重构过程中,您不需要更改此方法签名,而只需更改基础数据结构。我发现这在协同工作时特别有用,其中有人指定接口并且有人需要实现它。