c++为函数使用结构参数而不是多个参数
C++ using struct arguments for functions instead of multiple arguments?
有人认为使用类或结构体传递参数有什么好处吗?
Like代替
f(int,float,string)
f(Args)
式中Args
为struct
, int
, float
, string
为成员。
优点是易于创建多个默认形参,并且在添加新参数时不必更改函数签名。
明显的好处是对语义相关的数据项进行逻辑分组。
一旦你这样做了,在结构上添加一些(成员)操作来保证你的不变量。
封装提高了代码的抽象级别,这使得它更容易维护/推理。
参见得墨忒耳定律
我认为最大的优点是不必依赖于参数顺序。如果经常更改接口,依赖顺序很容易出错,而如果更改形参结构,则总是显式地将值赋给具有特定语义的成员变量。
以Direct3D11 ID3D11Device::CreateDepthStencilState函数为例:传递const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc
比请求所需的所有参数要清楚得多。
此外,考虑可修改性:在重构期间,您不需要更改此方法签名,只需要更改底层数据结构。我发现这在协同工作时特别有用,在这种情况下,有人指定接口,其他人必须实现它。
有人认为使用类或结构传递参数有什么好处吗?
是的,我认为有很多优点。
在函数上有大的参数列表会分散客户端代码的语义参数一致性,这可以在适当的struct
或class
中更好地管理。
如果以后需要添加额外的(可能是可选的)参数,使用struct
也更加灵活。
使用类/结构体中包含的一个参数还是多个参数取决于参数的含义。
结构体使用不当:
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指针传递的,第四个是通过值传递的,那么将需要大量的代码。将要求您显式地为参数结构体编写move构造函数和默认构造函数,这将很快变得乏味。向该结构体中添加成员也很繁琐。
我还认为使用结构体更好:您可以避免参数类型和顺序的混乱。假设您有foo(A, B)
(用于类型A
和B
)。但是foo(b, a)
仍然可以编译,这取决于隐式结构等。
这个概念也可以使用某种Context
类进行推广。依靠c++ 11可变模板,您可以将"参数超集上下文"传递给子集。
- 使用不带参数的函数访问结构元素
- 将结构字段的类型展开为可变模板参数
- MSVC将仅移动结构参数解释为指针
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何传递带有通过引用传递的结构参数的函数?
- 展开可变参数模板结构
- 在类构造函数中定义结构变量的参数
- 如何在方法中传递结构参数
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 带参数的数据结构的全局声明
- C++ 带有默认参数的结构,可选择在构造函数中更改
- C++-将具有引用的长参数列表重构为结构
- 为私有结构定义双参数运算符重载
- 我们可以用参数化构造函数初始化结构的数组吗?
- 关于类的想法 参数结构给定实现
- 重映射模板参数结构
- 从C 调用的编译MATLAB函数的输入参数结构
- 如何实现具有不同参数结构的纯虚拟函数
- 如何在C++中获得可更改的函数参数结构
- 函数参数 -> 结构体成员的 void* 和常量 void* 的解决方案