如何处理默认构造函数和重载构造函数之间的歧义?

时间:2012-05-29 16:59:23

标签: c++

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

5 个答案:

答案 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参数,它会将其与其他构造函数混淆。