【问题标题】:C++ constructor default value header fileC++构造函数默认值头文件
【发布时间】:2011-09-03 23:32:15
【问题描述】:

我正在尝试创建一个具有默认值的构造函数。复杂性来自为类使用单独的头文件和代码文件。我有一个头文件,其中包含:

class foo {
    bool dbg;
    public:
        foo(bool debug = false);
}

还有一个代码文件包含:

foo::foo(bool debug = false) {
    dbg = debug;
}

当我尝试使用 g++(即g++ -c foo.cc)进行编译时,会出现错误:

foo.cc:373:65: error: default argument given for parameter 1 of ‘foo::foo(bool)’
foo.h:66:4: error: after previous specification in ‘foo::foo(bool)’

我做错了什么?

【问题讨论】:

    标签: c++ class constructor default-value


    【解决方案1】:

    默认只能进入头文件。根据我的经验,在构造函数(或其他函数)中使用默认值很少是一个好主意——它通常在某处有点杂乱无章。并不是说我自己的代码中没有几个!

    【讨论】:

    • 谢谢。有用 :)。正如您可能从我的示例中看到的那样,我这样做是为了在必要时提供一些调试信息。如果不是通过构造函数中的默认值,是否有推荐的实现方式?
    • @nbt 与构造函数链接相反?特别是当有很多成员需要初始化时?在我看来,这是构造函数中默认参数值的一个实用好处。
    【解决方案2】:

    默认值只能在函数的声明中,声明和定义是分开的。


    如果您愿意,可以将默认值添加为注释,但您应该注意,因为更改默认值并忘记更改注释可能会导致一些误导(:

    例如:

    foo(bool debug = false);
    
    //...
    
    foo::foo(bool debug /* = false */ )
    { /* ... */ }
    

    【讨论】:

      【解决方案3】:

      成员函数定义中不需要默认参数,

      foo::foo(bool debug) {
          dbg = debug;
      }
      

      【讨论】:

        【解决方案4】:

        不要在定义中提供默认值

        foo::foo(bool debug) {
            dbg = debug;
        }
        

        现在它是正确的。默认值应仅在声明中提供,您已在头文件中完成。

        顺便说一句,比起赋值,更喜欢使用成员初始化列表:


        当然,如果它的声明兼定义,那么您必须在声明兼定义中提供默认值(如果需要):

        class foo {
            bool dbg;
            public:
                foo(bool debug = false) : dbg(debug) {}
                                       //^^^^^^^^^^^ using member initialization list
        }
        

        【讨论】:

          【解决方案5】:

          在 C++ 中(我不知道其他语言),默认参数只是函数声明的一部分,而不是函数定义的一部分。

          class foo {
              bool dbg;
              public:
                  foo(bool debug = false);
          }
          

          没关系,把你的定义改成:

          foo::foo(bool debug) {
              dbg = debug;
          }
          

          【讨论】:

            猜你喜欢
            • 2014-05-15
            • 1970-01-01
            • 2022-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-14
            • 2014-07-09
            相关资源
            最近更新 更多