【问题标题】:Calling constructor with multiple arguments使用多个参数调用构造函数
【发布时间】:2013-02-17 00:45:57
【问题描述】:

我有

Triangle::Triangle()
{
    A = NULL;
    B = NULL;
    C = NULL;
}
Triangle::Triangle(Point& X,Point& Y, Point& Z)
{
    A = new Point;
    *A = X;
    B = new Point;
    *B = Y;
    C = new Point;
    *C = Z;
}

and 

istream& operator>>(istream& in, Triangle& T)
{
    Point X,Y,Z;
    in>>X>>Y>>Z;
    Triangle T(X,Y,Z);  
    return in;
}

Point 是另一个类,它定义了一个带有 X 和 Y 坐标的点。 我不知道如何在重载函数中调用具有多个参数的构造函数。你能帮帮我吗?

【问题讨论】:

  • 有什么理由使用指针作为类的点并通过非常量引用获取构造函数参数?
  • 您不应该在该函数中使用构造函数,如果您通过引用传递Triangle,则不应该。

标签: c++ constructor arguments


【解决方案1】:

这就是你的做法:

Point px;
Point py;
Point pz;
Triangle trig(px, py, pz);

trig 将是对象,它是类Triangle 的一个实例,上面将使用 3 个 Point 参数调用构造函数。

另一种方法是指针:

 Triangle *pTrig = new Triangle(pX, pY, pZ);

另外,我建议这样会更好:

Triangle::Triangle()
   : A(NULL), B(NULL), C(NULL)
{
}

Triangle::Triangle(const Point& X,const Point& Y, const Point& Z)
 : A(new Point(X)), B(new Point(Y)), C(new Point(Z))
{
}

假设 Point 有一个拷贝构造函数。

您想从operator>> 函数内部调用它来更新参数T,但这不起作用,因为您不能在已经构造的东西上调用构造函数。相反,您需要实现一个赋值运算符。请参阅http://en.wikipedia.org/wiki/Assignment_operator_%28C%2B%2B%29 了解更多信息。

那你就可以T = Triangle(X,Y,Z);

要实现赋值运算符,您可以这样做:

Triangle& Triangle::operator= (const Triangle& other)
{
    if (this != &other) // protect against invalid self-assignment
    {
        if (A != NULL) delete A;
        if (B != NULL) delete B;
        if (C != NULL) delete C;
        A = new Point(other.A);
        B = new Point(other.B);
        C = new Point(other.C);
    }
    return *this;
}

假设 Point 有复制构造函数。实现拷贝构造函数,请看http://en.wikipedia.org/wiki/Copy_constructor

复制构造函数如下所示,但您需要为 Point 执行此操作:

Triangle& Triangle::Triangle(const Triangle& other)
  : A(new Point(other.A)), B(new Point(other.B)), C(new Point(other.C))
{
}
}

【讨论】:

  • 啊……现在我明白了……你想在 operator>> 函数中调用它。不……那行不通。让我更新我的答案。
  • 太棒了!!它正在工作,您也完成了赋值运算符功能。伟大的!非常感谢!
【解决方案2】:

前两个构造函数是默认构造函数的覆盖。第三个功能是运算符重载,它重载 >> 运算符。您只需要创建一个 Triangle 类的对象,如下所示:

Triangle tr(x,y,z);

Triangle* tr = new Triangle(x,y,z);

其中 x、y 和 z 是 Point 类的对象。

顺便说一句,正如您在运算符重载(第三个函数)中看到的那样,您已经创建了一个 Triangle 类的对象 (Triangle T(X,Y,Z);)。

【讨论】:

  • 是的,但是运算符重载的参数是第一个构造函数,不会传递正确的 X、Y 和 Z 值
猜你喜欢
  • 2018-03-21
  • 2012-07-28
  • 1970-01-01
  • 2018-12-06
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多