我必须在头文件中的现有函数定义中添加一个默认的int&
参数(例如iNewArgument):
初始化最后一个参数以使其采用默认值的语法是什么?
..
virtual int ExecNew
(int& param1, int& RowIn,int& RowOut, char* Msg = '0',
bool bDebug=true, int& iNewArgument = NULL ) = 0 ;
.
.
NULL #defined为0
错误:默认参数:无法从
int
转换为int&
答案 0 :(得分:9)
您的示例表明您正在创建虚拟功能。虚拟(特别是纯)函数中的默认参数不是一个好主意,因为在调用重写函数时不会考虑它们。
struct A {
virtual void f(int = 4711) = 0;
};
struct B : A {
virtual void f(int) { /* ... */ }
};
现在,如果有人在f
对象上调用B
,他将拥有来提供参数 - 不使用默认值。您必须复制派生类中的默认参数,这会创建丑陋的冗余。相反,您可以使用非虚拟接口模式
struct A {
void f(int a) {
int out;
f(a, out);
}
void f(int a, int &out) {
doF(a, out);
}
protected:
virtual void doF(int a, int out&) = 0;
};
用户现在可以使用一个,并且使用两个参数从他调用该函数的任何类类型调用f
,并且A
的实现者不必担心默认参数。通过使用重载而不是默认参数,您不需要围绕左值或临时值。
答案 1 :(得分:4)
为非const引用提供默认参数的唯一有意义的方法是声明具有静态存储持续时间的独立对象并将其用作默认参数
int dummy = 0;
...
virtual int ExecNew(/* whatever */, int& iNewArgument = dummy) = 0;
它是否适合你是由你来决定的。
在函数内部,如果您需要检测是否使用了默认参数,则可以使用地址比较
if (&iNewArgument == &dummy)
/* Default argument was used */
答案 2 :(得分:1)
你做不到。 INewArgument必须是原始int或const引用。非const引用不能以您尝试使用它的方式使用。
答案 3 :(得分:1)
总之,你将不得不重做你的问题。你可以让你的int&一个常规的int并丢失引用行为(能够传递更改的值)或放弃具有默认值。
答案 4 :(得分:1)
对于非const引用类型,默认值必须是左值,因此上面尝试执行的操作将不起作用。你能做的是:
namespace detail {
int global;
}
void foo(int &x = detail::global) {}
或
void bar(const int &x = int(3)) {}
答案 5 :(得分:1)
你说NULL为#defined
为0,所以它是一个字面值。该参数是对int的引用,这意味着该函数可以更改该值。你如何改变文字的价值?
您需要将其设为const
引用,或者根本不作为引用。