【问题标题】:Default arguments in constructor--C++构造函数中的默认参数--C++
【发布时间】:2012-02-26 21:35:52
【问题描述】:

我有一个 C++ 类,其中有一个构造函数,它采用 char*,char*, ostream。我想为ostream (cerr) 提供一个默认值。这是在标头还是.cpp 文件中完成的?

【问题讨论】:

  • 你不能通过值传递ostreams。
  • 不要;不要使用 *.cpp 的术语标题(因为这些东西可以混合在一起)。而是declarationdefinition。默认参数进入declaration

标签: c++ constructor default-value


【解决方案1】:

您需要将参数设为引用参数,请勿尝试复制std::cerr。您可能需要在头文件中指定默认参数,以便该类的所有客户端都可以看到它。

例如

class MyClass {
public:
    MyClass(char*, char*, std::ostream& = std::cerr);
    // ...
};

【讨论】:

  • 是的。我才意识到这一点。嗯。感谢您的及时回复。继续下一个问题! (现在我遇到了段错误。Woot。)(出于另一个原因)。
【解决方案2】:

在声明函数时指定默认参数:在这种情况下为头文件。

【讨论】:

    【解决方案3】:

    头文件是你声明默认值的地方。

    functionname(char *arg1, char* arg2, ostream &arg3 = cerr);
    

    然后在 cpp 文件中,您只希望它存在:

    functionname(char *arg1, char* arg2, ostream &arg3) {
    }
    

    IE,不要把它放在 .cpp 文件中。

    【讨论】:

    • 你不能通过值传递ostreams!
    【解决方案4】:

    C++ 使用单独编译。每个 cpp 文件都是单独编译的。如果你在 cpp 中使用默认值,它会正常工作,但是这个默认值只会在 cpp 文件中看到。

    当在项目编译器的其他文件中包含头文件时,它会从头文件中确定它需要的所有信息。如果默认值为 cpp 文件,则项目的其他部分无法查看 cpp 文件,因为它们可能已经编译。所以几乎在所有情况下,默认值都应该保存在头文件中

    另一个问题是你不能在 cpp 和 h 文件中都放默认值,因为在编译 cpp 文件时编译器将无法选择应该使用哪些默认值,你会遇到编译错误。

    您的解决方案是(在头文件中):

    class MyClass
    {
    public:
        MyClass(char*, char*, ostream& = cerr);
    ...
    };
    

    在极少数情况下,您可以在 cpp 文件中指定默认值,如果您只希望此文件查看和使用它们,而项目的所有其他部分将无法执行此操作。但这种情况很少发生

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 1970-01-01
      • 2012-06-30
      • 2016-03-01
      • 1970-01-01
      • 2010-09-16
      • 2010-12-10
      • 2014-05-15
      相关资源
      最近更新 更多