C++ 如果默认参数值是在调用站点不可见的代码中定义的,该怎么办?

C++ 如果默认参数值是在调用站点不可见的代码中定义的,该怎么办?,c++,header,C++,Header,我发现了一些奇怪的代码 //in file ClassA.h: class ClassA { public: void Enable( bool enable ); }; //in file ClassA.cpp #include <ClassA.h> void ClassA::Enable( bool enable = true ) { //implementation is irrelevant } //in Consumer.cpp #include <

我发现了一些奇怪的代码

//in file ClassA.h:
class ClassA {
public:
    void Enable( bool enable );
};

//in file ClassA.cpp
#include <ClassA.h>
void ClassA::Enable( bool enable = true )
{
   //implementation is irrelevant
}

//in Consumer.cpp
#include <ClassA.h>
....
ClassA classA;
classA.Enable( true );
//在ClassA.h文件中:
甲级{
公众:
作废启用(bool启用);
};
//在ClassA.cpp文件中
#包括
void ClassA::Enable(bool Enable=true)
{
//实施是无关紧要的
}
//在Consumer.cpp中
#包括
....
ClassA ClassA;
classA.Enable(真);
显然,由于
Consumer.cpp
只包含
ClassA.h
而不包含
ClassA.cpp
,编译器将无法看到该参数具有默认值


在方法实现的签名中声明的
ClassA::Enable
默认值何时会有任何影响?只有从包含
ClassA.cpp
的文件中调用该方法时才会发生这种情况吗?

将默认值放在声明中,而不是定义中

class ClassA {
public:
    void Enable( bool enable = true );
};

默认值只是编译时的事情。编译代码中没有默认值(没有元数据或类似的东西)。它基本上是“如果你不写任何东西,我会为你指定”的编译器替代品。因此,如果编译器看不到默认值,它假设没有默认值

演示:

只有当方法 从以下文件中调用 是否包括ClassA.cpp


没错。但请注意,这样做几乎肯定会产生多个定义错误,因此默认值仅在ClassA.cpp中的定义点可用。

首先让我承认,这是我第一次看到这种类型的代码。将默认值放入头文件是正常的做法,但这不是


我的猜测是,这个默认值只能从写在同一个文件中的代码中使用,这样编写这个函数的程序员就想在调用函数时使用它,但他不想干扰外部世界可见的接口(头文件)。

谁记下了这个??如果你把我记下来,告诉我为什么,这样我至少可以修正它。事实上,是我把它记下来的,原因是OP显然知道正确的方法是把它放在声明中,而不是定义中。OP想知道把这样一件事放在定义中会有什么影响,而你没有仔细阅读这个问题就回答了。是的,很抱歉没有让你知道降低分数的原因。我应该这么做。OP没有在声明中提到,所以我建议解决他提到的可见性问题?OP没有说或暗示他有可见性问题。他问一段特定代码的效果。在我看来,如果有人发现这个页面正在搜索关于如何指定默认参数的信息,这是一个很好的答案,但它不是问题的答案,也不可能对OP有用。因此,它是否值得向上投票或向下投票,我无法理解+0:-)这不是错误。只有当两个定义都提供默认值时,它才会产生错误。如果文件被多次包含,实际函数将导致多个定义错误,这就是我所指的。
// test.h
class Test { public: int testing(int input); };

// main.cpp
#include <iostream>
// removing the default value here will cause an error in the call in `main`:
class Test { public: int testing(int input = 42); };
int f();
int main() {
   Test t;
   std::cout << t.testing()  // 42
             << " " << f()   // 1000
             << std::endl;
   return 0;
}

// test.cpp
#include "test.h"
int Test::testing(int input = 1000) { return input; }
int f() { Test t; return t.testing(); }
g++ main.cpp test.cpp
./a.out