7

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;
} 
4

5 回答 5

4

首先,回答这个问题:

当你写作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;
    }
};    

错误是有原因的。如果你不知道你想从代码中得到什么,你怎么能期望编译器呢?

编辑:编辑后 - 不可能。没有那个确切的代码。

于 2012-05-29T17:11:12.130 回答
1

您对编译器的要求有歧义。

A(int a1)
{
    a=a1;
    b=54;
}

A(int a1,int b2=8)
{
    a=a1;
    b=b2;
}

当您的类仅由一个参数创建时,它们是相同的。首先用英语写下你对课堂的期望。然后,将其转换为 C++ 代码。示例:“如果我的类 A 仅使用一个参数创建,则使我的变量 a 等于该参数并使我的变量 b 为 54。如果它是由两个参数创建的,则将第一个给 a,第二个给b" 并且此表达式的代码是:

A(int a1,int b2=54)
{
    a=a1;
    b=b2;
}
于 2012-05-29T17:07:05.567 回答
1

删除A(int a1)函数而不是A b(3)调用A b(3, 54)

于 2012-05-29T17:14:40.097 回答
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 。但在许多情况下,这不是一个好的选择。

于 2012-05-29T17:13:24.653 回答
0

我删除了构造函数中的默认值 =8 并修复了它。您可以在构造函数的实现中指定 54,但不能指定参数。否则它将与没有 =8 参数的其他构造函数混淆。

于 2016-10-26T14:06:32.243 回答