我有
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是另一个用coordonates X和Y定义一个点的类。 我不知道如何在重载函数中使用多个参数调用构造函数。你能救我吗?
答案 0 :(得分:3)
您就是这样做的:
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))
{
}
}
答案 1 :(得分:0)
前两个构造函数是默认构造函数的覆盖。第三个功能是运算符重载,其重载>>运营商。您只需要创建一个Triangle类的对象,如下所示:
Triangle tr(x,y,z);
或
Triangle* tr = new Triangle(x,y,z);
其中x,y和z是Point类的对象。
顺便说一句,正如你在运算符重载(第三个函数)中看到的那样,你已经在创建一个Triangle类的对象(Triangle T(X,Y,Z);)。