2

C++/CX 初心者です。X と Y の 2 つのプロパティを持つ Vector クラスを作成したいと考えています。

標準 C++ では、コピー コンストラクターは次のとおりです。

Vector(const Vector& v);

これを C++/CX に次のように変換します。

Vector(const Vector^ v);

クラスは次のとおりです。

ヘッダ:

ref class Vector
{
public:
    Vector();
    Vector(const Vector^ v);

    property double X;
    property double Y;
};

実装:

Vector::Vector()
{
    X = 0;
    Y = 0;
}

Vector::Vector(const Vector^ v)
{
    this->X = v->X;
    this->Y = v->Y;
}

しかし、v->X を this->X as: no instance of function "Vector::X::get" に引数リストとオブジェクト (一致を防ぐ型修飾子としてのオブジェクト) が一致しないと、エラーが発生しました。

コピーコンストラクターを正しく実装するには?

ありがとう。

4

1 に答える 1

3

あなたの問題は、コピーコンストラクターに直接関係していません。コードをコンパイルすると、次のエラーが発生します。

'Vector :: X :: get':'this'ポインタを'const Vector'から'Vector%'に変換できません

これは、問題がconst-nessにあることを示しています。たとえば、この質問とその受け入れられた回答を参照してください。

問題は、些細なプロパティの場合、getアクセサが宣言されていないことのようconstです。そのため、のプロパティにアクセスすることはできませんconst Vector^

get解決策は、些細なプロパティを使用しないことですが、両方のアクセサーを自分で実装して、アクセサーを作成することだと思いますconst

private:
    double x;
    double y;
public:
    property double X
    {
        double get() const { return x; }
        void set(double value) { x = value; }
    }

    property double Y
    {
        double get() const { return y; }
        void set(double value) { y = value; }
    }

このアプローチの問題はconst、WinRTタイプのメソッドを使用できないことです(これが、getアクセサーがconst簡単なプロパティにない理由だと思います)。したがって、タイプをに変更すると、次のpublic ref classエラーが発生します。

WinRTタイプのメンバー関数の「get」:「const」および「volatile」修飾子はサポートされていません

constそのため、コピーコンストラクターで使用しないのが最善の選択肢だと思います。

Vector::Vector(Vector^ v)
{
    this->X = v->X;
    this->Y = v->Y;
}

のコピーコンストラクタが必要な理由はわかりませんが、ref class常に参照として使用するためです。

于 2012-07-22T12:48:33.757 に答える