【问题标题】:Default value for struct parameter结构参数的默认值
【发布时间】:2013-02-24 19:42:53
【问题描述】:

假设我有以下结构:

struct myStruct
{
 int x;
 int y;
 int z;
 int w;
};

我想在调用以下函数时将此结构初始化为默认值。如果有帮助,我正在寻找一个简单的零初始化。

void myFunc(myStruct param={0,0,0,0})
{
 ...
}

然而,这段代码给了我编译错误。我试过VS2003和VS2008。

注意:我看过其他提到使用构造函数的答案。但是我希望用户查看我用于初始化的值。

【问题讨论】:

  • myStruct param=myStruct{0,0,0,0}?
  • @HighCommander4 不。
  • 如果您需要其他程序员查看myStruct 的默认值(这是您希望将其定义为您所拥有的唯一原因),我会将该信息添加为注释,而不是在参数列表中创建一个默认结构 - 注释可能更优雅一些。或者,您可以改为传递一个指向 myStruct 的指针,默认参数值为 NULL,然后在方法内检查 NULL 并在需要时创建一个空结构。
  • @PLPiper 我可能最终会这样做,但我想知道是否有办法解决这个问题。
  • 我假设对 VS2003/VS2008 的限制是在参数集中使用初始化列表的限制因素。函数呢?

标签: c++ struct initialization default-value static-initialization


【解决方案1】:

在您的 myStruct 中添加 默认构造函数 将解决您的问题。

struct myStruct {
   myStruct(): x(0),y(0), z(0), w(0) { }   // default Constructor
   int x, y, z, w;
};

函数声明:

void myFunc(myStruct param = myStruct());

【讨论】:

    【解决方案2】:

    对于完全实现值初始化的现代 C++ 编译器,具有以下值初始化默认值来对 myStruct 的数据成员进行零初始化就足够了:

    myFunc(myStruct param=myStruct())
    

    对于其他编译器,你应该使用这样的东西:

    myStruct zeroInitilizer() {
       static myStruct zeroInitilized;
       return zeroInitilized;
    }
    myFunc(myStruct param=zeroInitilizer())
    

    为了避免编译器细节考虑使用http://www.boost.org/doc/libs/1_53_0/libs/utility/value_init.htm

    【讨论】:

    • 我想说现在zeroInitializer() 是没有必要的,你的第一个解决方案应该可以工作。无论如何,我会使其内联并返回由`= {}`初始化为零的局部常量变量的副本 ....
    • zeroInitializer 函数内部的static 的用途是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2017-07-12
    • 2010-12-23
    • 1970-01-01
    • 2010-10-19
    • 2014-01-17
    相关资源
    最近更新 更多