如何在C ++中调用无参数构造函数?

时间:2017-02-05 19:02:02

标签: c++

我在下面编写代码但收到错误消息

  

调用过载' Shape()'含糊不清

我可以看到有一个没有参数的构造函数,然后 为什么 我得到Shape()构造函数的歧义错误消息, 如何 可以解决吗?我可以看到它适用于对象s2s3但不适用于没有参数的构造函数。

当我宣布s1时如下:

Shape s1();   //而不是Shape s1

然后我收到print Shape方法的关注消息。 为什么? non-class type 指的是什么

  

请求会员'打印' in' s1',这是非类型' Shape()'

class Shape {

    int j;

    public:
        int i;
        const char* const c;

        double print() const {
            printf("Value of i is %d, j is %d and c is %s\n", i, j, c);
            return 0;
        }

        Shape() :
                i(10), j(0), c("Some string") {
        }
        Shape(int i = 10) :
                i(10), j(10), c("Some String") {
            this->i = i;
        }

        Shape(char* c) :
                i(), j(), c(strcpy(new char[strlen(c)], c)) {
        }
};

int main() {
    Shape s1; // call of overloaded 'Shape()' is ambiguous

    Shape* s2 = new Shape(1);

    Shape s3("Some string");

    s1.print(); // When using Shape s1() I am getting request for 
                // member 'print' in 's1', which is of non-class type 'Shape()'

    return 0;
}

2 个答案:

答案 0 :(得分:3)

问题是它无法弄清楚是否要打电话 Shape(int i = 10),i = 10 或Shape()

形状s1; 可能 Shape(10);(第二个) 要么 Shape();(第一个)

删除第二个构造函数的默认输入(用i替换i = 10 - >或删除第一个构造函数

答案 1 :(得分:2)

这是因为你有两个适用的构造函数:一个没有参数,一个带参数,也有一个默认值。
如果你有两个构造函数,可以调用它们,编译器应该调用哪一个?显然,编译器不知道并告诉您对构造函数的调用是不明确的。

要解决此问题,您需要通过删除第二个构造函数的默认值,显式传递值或删除其中一个构造函数来消除构造函数的歧义。