1

次のクラスを検討してください。

class Coord
{
public:
    double _x, _y;

    Coord(double x, double y)
    {
        _x = x;
        _y = y;
    }
};

class NamedPoint : public Coord
{
public:
    int _id;

    NamedPoint(int id, double x, double y) :
        Coord(x,y),
        _id(id)
    {
    }
};

NamedPointに対応するCoord型の参照を返すNamedPointのメンバー関数(coord())を作成したいと思います。

たとえば、次のようにします。

const Coord& NamedPoint::coord()
{
    return ((Coord)*this);
}

しかし、私は一時変数についての警告を受け取り、それに夢中ではありません。

もちろん、次の作品は次のとおりです。

Coord coord()
{
    Coord c = *this;
    return c;
}

しかし、私はむしろ参照を返したいです。

継承されたクラスを使用してこれが可能かどうか誰かが知っていますか?

機能のポイントを説明しなくてすみません。CoordとNamedPointでは異なる方法で==演算子をオーバーロードしています。Coordは単に{x、y}をチェックし、NamedPointは{id、x、y}をチェックします。この==テストの前にNamedPointをCoordにキャストするのを忘れた場合、間違ったバージョンを使用します。

だから、私はそれを認識しながら

(Coord)np1 == (Coord)np2 

私が欲しいものを私に与えるだろう、私はむしろ次のようなものを使用したい

np1.coord() == np2.coord()

何が起こっているのかについてはもっと明確だと思います。

4

2 に答える 2

7

関数のポイントは何ですか?NamedPointとにかく暗黙的に変換可能Coordです:

void foo(Coord& c)
{
    c._x = 5;
}

NamedCoord nc(0, 1, 2);
foo(nc); // c references the Coord part of nc

とにかく、関数は単にこの変換を使用する必要があります。

const Coord& NamedPoint::coord()
{
    // Bad: takes the value of *this and slices off
    // the derived bits, leaving a temporary Coord.
    /* return ((Coord)*this); */

    // Good: takes the value of *this and refers
    // to the base bits, no temporaries.
    return *this;

    // (Same as:)
    /* return ((Coord&)*this); */
}
于 2011-05-19T00:20:30.597 に答える
3

@GManが主な解決策を提供します。

ただし、問題をより詳細に指摘することは興味深いかもしれません。

const Coord& NamedPoint::coord()
{
    return ((Coord)*this);
}

これは、次とほとんど同じです。

const Coord& NamedPoint::coord()
{
    Coord c = *this;
    return c;
}

ここでは、スタック上の一時への参照を返していることは明らかです。これにより、その参照が役に立たなくなり、警告が表示されます。

提示されたケースでCoordは、が基本クラスであるため、@Gmanによって与えられる単純なソリューションがあります。

一般的なケースでは、原則として、への参照が必要な場合は、それがまだ存在somethingすることを確認することをお勧めします。something

于 2011-05-19T00:28:20.510 に答える