我必须用两个默认参数编写构造函数。
func(int arg1 , char* arg2 = "arg2", int arg3 = 1) //example
我提供了调用构造函数的方案,并为arg1
提供了值,arg2
和arg3
应使用默认值。然后实例化另一个对象,并为arg1
和arg3
赋予一个值,并且期望使用arg2
的默认值。
现在问题是,你“不能跳过”默认参数是我从文本和在线阅读。它的意思是从默认参数的重载中排序,但是场景使用了一个默认参数,而另一个则没有。这个问题的提示告诉我重新排序参数/参数。但是,我所做的任何重新排序似乎都无法解决此问题。
此外,不能使用重载的构造函数。这必须由一个构造函数完成。
那怎么会这样呢?我很难过,有点疯狂:(
答案 0 :(得分:8)
此外,不能使用重载的构造函数。这必须由一个构造函数完成。
我能想到这个要求的唯一原因是可选参数具有相同的类型。在这种情况下,您会陷入困境,并且您需要查看named constructor和/或named parameter惯用语。
否则,只需定义额外的构造函数。这可能涉及一些重复。默认值。
Foo(int arg1 , char const *arg2 = "arg2", int arg3 = 1)
{
construct(arg1, arg2, arg3);
}
Foo(int arg1, int arg3)
{
construct(arg1, "arg2", arg3);
}
答案 1 :(得分:2)
特殊限制,必须只有一个构造函数。这是我能想到的最接近的地方:
#include <iostream>
// cheap and cheerful Boost.Variant
struct StringOrInt {
char *s;
int i;
bool is_string;
StringOrInt(char *s) : s(s), i(0), is_string(true) {}
StringOrInt(int i) : s(0), i(i), is_string(false) {}
bool isInt() { return !is_string; }
int asInt() { return i; }
char *asString() { return s; }
};
struct Foo {
int m1;
char *m2;
int m3;
Foo(int arg1, StringOrInt arg2 = "arg2", int arg3 = 1) : m1(arg1) {
if (arg2.isInt()) {
arg3 = arg2.asInt();
arg2 = "arg2";
}
m2 = arg2.asString();
m3 = arg3;
}
void print() {
std::cout << m1 << " " << m2 << " " << m3 << "\n";
}
};
int main() {
Foo(1, "HelloWorld").print();
Foo(1, 2).print();
}
请注意,使用GCC会生成警告,因为从字符串文字到非const char*
的转换已弃用且不明智。但这是你要求的,并修复它,以便char*
参数和数据成员const char*
很容易。
一个显着的弱点是,这并不能阻止你写Foo(1,2,3)
。要在编译时检查,我认为你需要多个构造函数。要在运行时检查它,可以将第三个参数放入另一个类DefaultOrInt
,其中Default
是仅用于此目的的类型,仅支持一个值作为{{1的默认值}}。如果arg3
为真,请检查arg2.isInt()
是否为假,如果不是arg3.isInt()
。
答案 2 :(得分:2)
如果在第二个参数没有值时允许传递一个空的C字符串,你可以使用一个帮助函子来检查arg2
并返回默认值(如果它是空的)。像这样:
#define DEFAULT_ARG "arg2"
struct helper_class {
char* operator()(char* arg)
{
if (*arg) return arg; else return DEFAULT_ARG;
}
} helper;
class func {
public:
func(int arg1 , char* arg2 = "arg2", int arg3 = 1) {}
};
int main()
{
func f1(42, helper(""), 9001); // default 2nd argument
func f2(42, helper("Its over 9000!"));
}
不漂亮,我知道......
答案 3 :(得分:1)
现在您可以使用std::bind来执行此类操作,或者在c ++ 14/17中,您可以使用lambda函数并完成相同的操作。