2013-03-02 9 views
2

я имеюВызов конструктора с несколькими аргументами

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

Где точка еще один класс, который определяет точку с coordonates X и Y. я не знаю, как вызвать конструктор с несколькими аргументами в перегруженной функции , Вы можете мне помочь?

+1

Любые причины, по которым вы используете указатели для точек класса и принимаете аргументы конструктора по неконстантной ссылке? – chris

+0

Вы не должны использовать конструктор в этой функции, а не если вы передаете «Треугольник» по ссылке. – Beta

ответ

3

Это, как вы это делаете:

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

trig будет объект, который является экземпляром класса Triangle и выше, будет вызывать конструктор с 3-мя аргументами Поинт.

Другой способ для указателей:

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

Предполагая, что точка имеет конструктор копирования.

Вы хотите вызвать его изнутри функции 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; 
} 

Предполагая, что точка имеет конструкторы копирования. Для реализации конструкторы копирования, см http://en.wikipedia.org/wiki/Copy_constructor

копия конструктор выглядит следующим образом, но вы должны сделать это для Пункта:

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

Я попробовал и дал мне «переопределение формального параметра T '» – user2116010

+0

Ahh ... теперь я понимаю ... вы хотите называть его внутри функции оператора >>. Нет ... это не работает. Позвольте мне уточнить свой ответ. – ruben2020

+0

Отлично! Он работает, и вы тоже выполняли функцию оператора присваивания. Большой! Большое спасибо! – user2116010

0

Первые два конструктора переопределения для конструктора по умолчанию. Третья функция - перегрузка оператора, которая перегружает >> оператор. Вам просто нужно создать объект класса Triangle следующим образом:

Triangle tr(x,y,z); 

или

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

где х, у и г являются объектами класса Point.

Кстати, как вы можете видеть при перегрузке вашего оператора (третьей функции), вы уже создаете объект класса Triangle (Triangle T (X, Y, Z);).

+0

Да, но аргумент перегрузки оператора является первым конструктором и не будет передавать правильные значения для X, Y и Z – user2116010

Смежные вопросы