私は現在、古い大学の教科書を読み直しながら演算子のオーバーロードについて調査していますが、何かを誤解していると思うので、これが一部の回答者にとって簡単な評判になることを願っています. これが重複している場合は、正しい方向に向けてください。
(この段階では) 1 つのメンバー val (int) を持つ単純なカウンター クラスを作成しました。
これらのカウンターのうち 3 つを varOne から varThree に初期化し、3 番目のカウンターを最初の 2 つの合計にします (たとえば、以下のコードでは varThree.val が 5 に設定されています)。
counter::counter(int initialVal)
{
val = initialVal;
//pVal = new int;
//*pVal = 10; // an arbitrary number for now
}
int main (int argc, char const* argv[])
{
counter varOne(3), varTwo(2), varThree;
varThree = varOne + varTwo;
return 0;
}
次のように operator+ をオーバーロードしました。
counter operator+(counter& lhs, counter& rhs)
{
counter temp(lhs.val + rhs.val);
return temp;
}
これを非メンバー関数にし、プライベート値にアクセスできるようにカウンター クラスのフレンドにしました。
私の問題は、別のプライベート メンバーpVal (int へのポインター) を追加するときに始まります。varThree = varOne
これを追加すると、varOne が破棄されても varThree.pVal は引き続き同じメモリ ビットを指しているため、単純なコピーを実行できなくなります。
私はoperator=
次のようにオーバーロードしました。
int counter::getN()
{
return *newVal;
}
counter& counter::operator=(counter &rhs)
{
if (this == &rhs) return *this;
val = rhs.val;
delete pVal;
pVal = new int;
*pVal = rhs.getN();
return *this;
}
varThree = varOne
今、すべてが正しくコピーされるようなことをするvarThree = varOne + varTwo
と、次のエラーが発生します。
counter.cpp: In function ‘int main(int, const char**)’:
counter.cpp:96: error: no match for ‘operator=’ in ‘varThree = operator+(counter&, counter&)(((counter&)(& varTwo)))’
counter.cpp:55: note: candidates are: counter& counter::operator=(counter&)
make: *** [counter] Error 1
counter::operator=
からの戻り出力に対処するのに問題があるように見え、返される型を受け入れるためにさらにoperator+
オーバーロードする必要がありますが、運がなく、何かをしたのではないかと考え始めています根本的に間違っています。operator=
operator+