1

誰かが私に違いを非常に小さな言葉で説明してもらえますか?私はこれを理解したことがなく、現在のプロジェクトで非常に混乱しています。私がやろうとしているのは、このコードを修正することです。

const Multinumber& Pairs::operator+(const Multinumber &rhs) const
{
    const Pairs &_rhs = dynamic_cast<const Pairs &>(rhs);
    Pairs toreturn(_rhs.X_value+X_value,_rhs.Y_value+Y_value);
    return toreturn; //reference to local variable? fix this?
}

これで、コンパイラはこれがローカル変数への参照であると教えてくれますが、参照とはどういうわけか異なるため、ポインタに戻ることはできません。そして、抽象クラスのオブジェクトへの参照またはポインターを保持することになっているセットクラスにも取り組んでいます。私は完全に混乱しています。どんな助けでも大歓迎です。

4

3 に答える 3

2

まず、あなたの署名が間違っています。そのはず:

Multinumber Pairs::operator+(const Multinumber &rhs) const;

operator+どちらの引数への参照ではなく、新しいオブジェクトを返す必要があります。

参照とポインタの違いについては、この詳細な質問はここSOにあります。それはすべての基本といくつかをカバーしています。

于 2010-11-25T22:55:53.853 に答える
1

あなたは非常に混乱しているようです:)わかりました、そう:

基本的に、ポインタは別の変数のアドレスを格納する単なる変数です。たとえば、がint呼び出されたとするとi、そのアドレスをポインタに格納できますp

int i = 23;
int *p = &i;    // p has type int* (pointer to int) and stores &i (the address of i)

次に、それが指すもの(つまり、アドレスが格納されている変数)を変更したい場合は、割り当てるだけ*pです。これは、指すものを示すために使用される構文です。この場合、*pを参照しiます。したがって:

*p = 9;     // sets i to 9 (since *p is i)

に割り当てるだけで、ポインタを再設定できます(pつまり、他の何かを指すようにできます) 。

int j = 84;
p = &j;     // store j's address in p, overwriting what was there before (i.e. i's address)
*p = 18;        // sets j to 18 (since *p is now j)

さて、リファレンスは少し異なります。参照は、変数のエイリアスを作成します。

int i = 23;
int& r = i;     // r has type int& (reference to int) and refers to i

参照はポインターの観点から実装される場合がありますが(または、特にコンパイラーが最適化を開始する場合はそうではない場合があります)、プログラミングの観点からは関係ありません。ここで重要なのは、言語の動作方法だけです。

参照されているものを変更したい場合(つまりi、この場合)、次のようにします。

r = 9;      // sets i to 9 (since r is an alias for i)

ポインタとは異なり、参照を再配置することはできません。先ほど示したように、に割り当てると、参照自体ではなく、参照rしているもの()が変更されます。iさらに、参照は再装着できないため、すぐに初期化する必要があります。これはポインタには当てはまりません。言い換えると:

int *p;     // legal
int& r;     // bad

最後の基本的な違いの1つは、ポインターがである可能性があることです。これは、ポインターがNULL何も指していないことを示します。これは、アドレスが含まれていることを意味します0。参照は常に実際のオブジェクトを参照する必要があります。この違いは、実装者にとって重要な場合があります。これは、ポインタを使用して多分型を実装できるためです。つまり、ポインタがそうでない場合NULLは、ポイントされたオブジェクトを使用します。それ以外の場合は、別のことを行います。彼らは参照で同じことをすることはできません。

ポインタと参照に関してそれが明確であることを願っています!


さて、あなたに関してoperator+-加算演算子の目的は、2つのオブジェクトを加算し、それらの合計を表す新しいオブジェクトを返すことです。したがって、2Dベクトル型がある場合は、operator+次のように記述できます。

Vec2 operator+(const Vec2& lhs, const Vec2& rhs)
{
    return Vec2(lhs.x+rhs.x, lhs.y+rhs.y);
}

コードでは、参照によってローカルオブジェクトを返そうとしています。これは、演算子の最後に存在しなくなるtoreturnため、機能しません。toreturn代わりに、ここで値で返す必要があります。ちなみに、ポインタを返そうとすると同じ問題が発生します。

Vec2* operator+(const Vec2& lhs, const Vec2& rhs)
{
    Vec2 result(lhs.x+rhs.x, lhs.y+rhs.y);
    return &result; // bad!
}

そのコードでresultは、演算子の最後に存在しなくなるため、返すポインターは無効な場所を指すことになります。結論-この種の状況では、派手なことは何も試みないでください。値で返します。

于 2010-11-26T03:21:20.513 に答える
0

ポインタには、オブジェクトがある場所にアドレスがあります。また、参照はポインタのエイリアスであり、逆参照する必要がないことを意味します。ただし、使用法は似ています。オブジェクトをコピーせず、オリジンでのみ機能します。

変数toreturnをローカル変数として使用します。これは、コンパイラがメソッドの最後にこのオブジェクトのデストラクタを生成することを意味します。したがって、破壊されたオブジェクトを返そうとしています。

于 2010-11-25T22:59:01.393 に答える