【问题标题】:Class Constructor arguments C++类构造函数参数 C++
【发布时间】:2011-09-25 14:51:07
【问题描述】:

我正在为 x 和 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; }
};

【问题讨论】:

  • 您有两个签名相同的 ctor。如果我调用 pair1(3.1),应该运行哪一个?
  • 用一个简单的std::pair<double, double>怎么样?您可以像 x(1.2, 0)x(0, 4.3)x() 一样初始化它。这将比您的代码更有效(例如,您为什么不使用初始化程序?)。

标签: c++ class constructor arguments


【解决方案1】:

我不确定除了 (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);

【讨论】:

    【解决方案2】:

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

    pair1(double a)
    

    pair1(double b)
    

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

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

    这称为模糊重载。

    【讨论】:

    • 那么我会只用一个吗?我现在有点迷路了。我在类中有函数,例如 1.assign()- 分配 x 和 y 值。 2. setx() - 设置 x 值和设置值的 sety()。会使用这些帮助吗?
    • @Stephen 是的。最直观的做法是提供一个将两个值都初始化为零的默认构造函数,就像您所做的那样,并提供一个接受两个参数并初始化两个值的构造函数。
    【解决方案3】:
    pair1( double a ){ x = a; y =0.0; }
    pair1(double b){ x = 0.0;  y = b; }
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 2021-09-23
        • 2015-01-31
        • 1970-01-01
        • 2014-05-27
        • 2021-08-29
        • 2015-10-11
        相关资源
        最近更新 更多