A b(3)行产生歧义,因为它可以调用两个可能的构造函数中的任何一个。单个参数参数化构造函数或带有默认参数的双参数参数化构造函数。我该如何解决这个问题?
#include<iostream>
using namespace std;
class A
{
public:
int a,b;
A()
{
a=5;
b=6;
}
A(int a1)
{
a=a1;
b=54;
}
A(int a1,int b2=8)
{
a=a1;
b=b2;
}
void show()
{
cout<<"a="<<a<<" b="<<b<<endl;
}
};
int main()
{
A a(3); // I want A(int a1,int b2=8) to get executed
A b(3); // I want A(int a1) to get executed
a.show();
b.show();
return 0;
}
答案 0 :(得分:5)
首先,回答这个问题:
当您撰写A a(4)
时,您希望a.b.
成为:
选项a) 54
class A
{
public:
int a,b;
A()
{
a=5;
b=6;
}
A(int a1,int b2 = 54)
{
a=a1;
b=b2;
}
};
选项b) 8
class A
{
public:
int a,b;
A()
{
a=5;
b=6;
}
A(int a1,int b2 = 8)
{
a=a1;
b=b2;
}
};
错误是有原因的。 如果您不知道代码中的内容,那么您对编译器的期望是什么?
编辑:编辑后 - 不可能。不是那个确切的代码。
答案 1 :(得分:1)
您从编译器要求的内容具有模糊性。
A(int a1)
{
a=a1;
b=54;
}
和
A(int a1,int b2=8)
{
a=a1;
b=b2;
}
当您的类仅由一个参数创建时,是相同的。首先用英语写下你对课堂的期望。然后,将其转换为c ++代码。示例:&#34;如果我的A类只使用一个参数创建,那么使我的变量等于该参数并让我的变量b为54.如果它由两个参数创建而不是给第一个参数a,第二个到b&#34;这个表达式的代码是:
A(int a1,int b2=54)
{
a=a1;
b=b2;
}
答案 2 :(得分:1)
删除A(int a1)
功能,而不是A b(3)
致电A b(3, 54)
答案 3 :(得分:0)
在你的例子中,当只用一个参数调用它时,编译器无法判断你是指第二个还是第三个构造函数。
通常,如果您需要添加一个带有其他默认参数的新构造函数,您可以使默认值产生与早期构造函数相同的行为,并删除早期版本,例如:在这种情况下,b2的默认值必须为54.或者,不要给新构造函数一个默认参数,只需要调用者明确地传递它。
我想另一种选择是使用默认构造函数的多个派生类,它们将不同的参数传递给基类构造函数。
class A
{
public:
int a, b;
A() { a = 5; b = 6; }
A(int a1) { a = a1; b = 54; }
A(int a1, int b1) { a = a1; b = b1; }
...
};
class B: public A
{
public:
B(int a1): A(a1, 8) { }
};
希望A :: b用8而不是54初始化的代码创建一个B代替。但在许多情况下,这不是一个好的选择。
答案 4 :(得分:0)
我在构造函数中删除了default = 8并修复了它。您可以在构造函数的实现中指定54,但不能指定参数。否则,如果没有= 8参数,它会将其与其他构造函数混淆。