5

私は持っています

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を座標化してポイントを定義する別のクラスです。オーバーロードされた関数で複数の引数を使用してコンストラクターを呼び出す方法がわかりません。手伝って頂けますか?

4

2 に答える 2

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))
{
}
}
于 2013-03-02T15:18:24.687 に答える
0

最初の2つのコンストラクターは、デフォルトのコンストラクターのオーバーライドです。3番目の関数は、>>演算子をオーバーロードする演算子のオーバーロードです。次のように、Triangleクラスのオブジェクトを作成する必要があります。

Triangle tr(x,y,z);

また

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

ここで、x、y、およびzはPointクラスのオブジェクトです。

ちなみに、演算子のオーバーロード(3番目の関数)でわかるように、既にTriangleクラス(Triangle T(X、Y、Z);)のオブジェクトを作成しています。

于 2013-03-02T15:25:32.780 に答える