繁体   English   中英

Class 构造函数 arguments C++

[英]Class Constructor arguments C++

我正在为 ax 和 y 笛卡尔坐标系创建一对 class。 x 和 y 是双精度数。 我需要有 3 个构造函数。

  1. 没有 arguments,默认 x 和 y 为零。
  2. 一种论点将 x 赋值并将 y 默认为零。
  3. 一种参数默认 x 为零并分配 y。 我不确定我是否正确设置了 class。 我收到以下错误: pair1::pair1(double)pair1::pair1(double)不能重载。

我的 class:

class pair1
{
private:
    double x;
    double y;

public:
    pair1(){ x = 0.0, y = 0.0; }    
    pair1( double a ){ x = a; y =0.0; }
    pair1(double b){ x = 0.0;  y = b; }
};

1) 没有 arguments,默认 x 和 y 为零。

这很容易

2) 一个论点指定 x 并将 y 默认为零。

3)一个arugeument默认x为零并分配y。

那是个问题。 当您只有一个参数时,您怎么知道要调用这两个参数中的哪一个? 这就是你得到编译错误的原因。

取而代之 - 使用默认构造函数(没有参数的那个)、完整的构造函数(两个都有),如果需要,使用SetX()SetY()分别设置 X 和 Y,并通过名称来区分function。

class pair1
{
    private:
    double x;
    double y;

    public:
    pair1( double a=0.0, double b=0.0 ){ x = a; y =b; };
                     // default value 0.0 allows to only
                     // set x, and leave y to be the default,
                     // or leave them both default.
    void SetX(double a) { x=a;};
    void SetY(double b) { y=b;};
};

问题是编译器没有办法区分

pair1(double a)

pair1(double b)

实际上,除了参数的名称之外,它们是相同的。 例如:

pair1 myPair1(123.456); // Which constructor should be called?

这称为模糊重载。

pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0;  y = b; }

这些是完全相同的构造函数。 不同的参数名称没有任何区别。 重载重要的是类型和类型的数量,以及它们的顺序

我不确定除了 (0,0) 情况外,默认 arguments 是否有任何用途,但这样的事情是否可行:

struct X
{
    double value;
    explicit X(double v) : value(v) {}
};

struct Y
{
    double value;
    explicit Y(double v) : value(v) {}
};

class pair1
{
    private:
        double x;
        double y;

    public:
        pair1() : x(0.0), y(0.0) {}
        explicit pair1(X a) : x(a.value), y(0.0) {}
        explicit pair1(Y b) : x(0.0), y(b.value) {}
        pair1(X a, Y b) : x(a.value), y(b.value) {}  // For completeness
        pair1(Y b, X a) : x(a.value), y(b.value) {}  // For super-completeness
        pair1(double a, double b) : x(a), y(b) {}
};

利用:

pair1 aPair(X(2.0));                 // default y
pair1 anotherPair(Y(4.875));         // default x
pair1 aThirdPair(X(1.0), Y(1.0));
pair1 aForthPair(Y(100.0), X(1.0));  // keyword arguments ;-)
pair1 quintus(23.0, 45.6);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM