0

私はここで骨の折れる何かをしている可能性が高く、ポインターが必要です (しゃれを許してください)。

次のクラスを定義しました。

ref class CoordinatePair {
public:
    int x;
    int y;
    CoordinatePair();
    CoordinatePair(int xInput, int yInput);
    CoordinatePair(CoordinatePair ^Other);
    //CoordinatePair& operator->();
};

かなり単純です。->クラスの名前空間内で演算子を使用して、悪影響なしにメンバーを選択できることがわかりました。たとえば、次のようにコンパイルされます。

CoordinatePair::CoordinatePair(CoordinatePair ^Other) {
    x = Other->x;
    y = Other->y;
}

グルーヴィー。しかし、これをコンパイルしようとすると、問題が発生します。

CoordinatePair^ Coordinates::TranslateCoords(CoordinatePair^ WorldCoords) {
    CoordinatePair^ newCoords = gcnew CoordinatePair();
    float coordsRatio = 0.0;
    //Translate X
    coordsRatio = (float) WorldCoords->x / WorldBounds->x;
    newCoords->x = (int) (coordsRatio * PixelBounds->x);
    //Translate Y
    coordsRatio = 0.0;
    coordsRatio = (float) WorldCoords->y / WorldBounds->y;
    newCoords->y = (int) (coordsRatio * PixelBounds->y);
    return newCoords;
}

(上記のコードでWorldBoundsは、 はクラスのメンバーであることに注意してくださいCoordinates。それ自体がCoordinatePair、プロジェクトの平面を定義する です。)

具体的には、次のエラーが発生します。

.\Coordinates.cpp(95) : error C2819: type 'CoordinatePair' does not have an overloaded member 'operator ->'

は。まあいいよ。この問題を調査しようとした結果、演算子のオーバーロードを試みることになりました。そのため、クラス宣言に次を追加しました。

CoordinatePair^ operator->();

そして、私はそれを次のように定義しました:

CoordinatePair^ CoordinatePair::operator->() {
    return this;
}

それはコンパイラをさらに怒らせました!:-(

.\Coordinates.cpp(17) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(17) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(18) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(18) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(62) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(95) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(95) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(95) : error C2818: application of overloaded 'operator ->' is recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'
.\Coordinates.cpp(95) : warning C4280: 'operator ->' was self recursive through type 'CoordinatePair'
        y:\documents\wende-project\c3\wende_c3_executioncode\wende_c3_executioncode\c3_display\c3_app\Coordinates.h(7) : see declaration of 'CoordinatePair'

エラーを調べると、次の定義が得られました。

オーバーロードされた 'operator ->' の適用は、型 'type' を介して再帰的です

クラス メンバー アクセス演算子の再定義に、再帰的な return ステートメントが含まれています。-> 演算子を再帰で再定義するには、再帰ルーチンを演算子オーバーライド関数から呼び出される別の関数に移動する必要があります。

ここで何をしているのかはっきりとわからないので、正しい方向に設定する必要があります。ヘルプ?

4

1 に答える 1

1

パトリックがコメントで言ったように、あるべきときにWorldBoundsタイプとして持っています。あなたが言ったように、その修正は他のコンパイラエラーを引き起こします.現在行っているすべての場所を調べて.CoordinatePairCoordinatePair^WorldBounds.xWorldBounds->x

の場合、ref classほとんどの場合、^. オフにしたい状況もありますが、まれです。

于 2012-06-06T17:51:26.963 に答える