类构造函数参数 C++

发布于 2024-11-18 04:43:49 字数 476 浏览 1 评论 0原文

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

  1. 无参数,默认 x 和 y 为零。
  2. 一种争论分配 x 并将 y 默认为零。
  3. 一个参数将 x 默认为零并分配 y。我不确定我是否正确设置了班级。我收到以下错误: pair1::pair1(double)pair1::pair1(double) 无法重载。

我的班级:

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

I am creating a pair1 class for a x and y Cartesian coordinate system. x and y are doubles. I need to have 3 constructors.

  1. No arguments, defaults x and y to zero.
  2. One arguement assigns x and defaults y to zero.
  3. One arugeument defaults x to zero and assigns y. I'm not sure if I am setting up the class right. I get the follwing error: pair1::pair1(double) and pair1::pair1(double) cannot be overloaded.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

呆萌少年 2024-11-25 04:43:49

1) 无参数,默认 x 和 y
零。

这很容易

2) 一个争论分配 x 和
默认 y 为零。

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

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

相反 - 使用默认构造函数(不带参数的构造函数)、完整构造函数(同时包含两者的构造函数)(如果需要)以及 SetX()SetY() 进行设置X和Y分开,并通过函数名称进行区分。

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

1) no arguments, defaults x and y to
zero.

That's easy

2) one arguement assigns x and
defaults y to zero.

3) one arugeument
defaults x to zero and assigns y.

That's a problem. How do you know, when you only have one parameter, which of the two is meant to be called? That's why you get a compilation error.

Instead - use the default constructor (the one with no parameters), full constructor (the one with both), if needed, and SetX() and SetY() to set the X and Y separately, and make distinction by the name of the 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;};
};
萌︼了一个春 2024-11-25 04:43:49

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

pair1(double a)

pair1(double b)

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

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

这称为模糊重载。

The problem is that the compiler has no way to distinguish

pair1(double a)

and

pair1(double b)

Indeed, they are the same thing except for the name of the parameter. For example:

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

This is called ambiguous overloading.

神回复 2024-11-25 04:43:49
pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0;  y = b; }

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

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

These are exactly same constructor. Different parameter name doesn't make any difference. All that matters for overloading is, the type(s) and number of types, and their ordering.

萌能量女王 2024-11-25 04:43:49

我不确定除 (0,0) 情况外的默认参数是否有任何用处,但类似这样的方法可以工作:

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

I'm not sure that having default arguments except for the (0,0) case is of any use, but something like this could work:

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

Use:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文