1

メンバーおよび関数としてのC++オーバーロード演算子を同時に使用しますか?ここで演算子のオーバーロードを設定しようとしています。

いずれの場合も、友人およびメンバーとしてのoperator+のオーバーロードに問題はありません。しかし、友人として+演算子をオーバーロードしようとすると、同時にメンバーとして友人をオーバーロードしようとすると、エラーが発生します。

ここでちょっと混乱しています。私も意味をなさない何かをしようとするかもしれませんか?私のコードをチェックして、私がそれを解決できるかどうかを確認してください。ケース3は、エラーを生成するケースです。ありがとう!

CASE1フレンドとしてのオーバーロード:Source.cpp

#include <iostream>
using namespace std;
#include "Time.h"
int main () {
Time planning;       Time coding(2, 40);
Time fixing(5, 55);  Time total;
total = coding + fixing;
cout << "coding + fixing = ";
total.Show();
cout << endl;
cin.get();  return 0; }

CASE1友達としての過負荷:Time.h

#pragma once
class Time
{ int hours; int minutes;
public:
Time(void);
~Time(void);
Time(int, int m = 0);
void AddMin(int);
void AddHr(int);
void Reset(int h=0, int m=0);
friend const Time operator+(const Time&amp;, const Time&amp;);
void Show() const; };

CASE1フレンドとしてのオーバーロード:Time.cpp

#include "Time.h"
#include <iostream>
using namespace std;
Time::Time(void) { hours = minutes = 0;}
Time::~Time(void) {}
Time::Time (int h, int m) { hours =h; minutes = m; }
void Time::AddMin(int m) {minutes+=m; hours+=minutes/60; minutes%= 60; }
void Time::Reset(int h, int m) {hours = h; minutes = m;}

const Time operator+(const Time &amp; t1, const Time&amp; t2) {
Time sum;
sum.minutes = t1.minutes + t2.minutes;
sum.hours = t1.hours + t2.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }
void Time::Show() const
{ cout << hours << " hours, " << minutes << " minutes"; }

メンバーとしてのCASE2オーバーロード:Source.cpp / Time.h / Time.cppSource.cpp//同じ

Time.h

const Time operator+(const Time&amp;) const;  // declaration

Time.cpp

const Time Time::operator+(const Time&amp; t) const {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }  // function definition

ケース3:エラー; 演算子+をフレンドとメンバーとして同時にオーバーロードしようとしているSource.cpp//同じ

Time.h

friend const Time operator+(const Time&amp;) ;  // declaration

Time.cpp

friend const Time operator+(const Time&amp; t) {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }  // function definition
4

1 に答える 1

1

タイプに演算子のオーバーロードを指定する場合、実行しているのは、演算子がコードに表示されたときに呼び出す関数を提供することです。1つしか呼び出せず、それを選択する方法がない場合、2つの定義を提供することは意味がありません。

つまり、メンバー関数とフリー関数のオーバーロードの両方を使用しないでください。

次のことは、実際にはあなたの混乱かもしれませんが、その意味は何ですかfriend。フレンド宣言を提供すると、無料の関数を宣言し、その関数にプライベートメンバーへのアクセスを許可することになります。これは無料の関数であるため、暗黙のthis引数はありません。したがって、次のようになります。

class X {
   friend X operator+(X const &);
};

operator+は、型の単一の引数を取り、型X const&のオブジェクトを返すオーバーロードを宣言しますX。ちなみに、これは有効な演算子であり、オーバーロードすることを意味する演算子ではありません(のように単項operator+ですX x; +x;)。前の段落に戻ると、メンバー関数ではなく、自由関数を宣言してthisいます。宣言した場合と同様に、暗黙的な関数はありません。

class X {};
X operator+(X const &);

また、暗黙的なものはなくthisminutesそれhours自体はその関数内では意味がなく、コンパイルに失敗するためです。(friend定義内のキーワードも間違っておりfriend、クラス定義の外に表示されることはありません)。

friend演算子に関して特別な意味があるかどうかについては、多少の混乱がありますが、そうではありません。これは、アクセス指定子に影響を与える単なるキーワードです。friend自分のタイプのパブリックインターフェイスの観点から演算子を実装できる場合は、そもそも演算子を実装するべきではありません。したがって、たとえばTime、時間と分を取得するためのアクセサーがいる場合は、次のように演算子を実装できます。

class Time { // ...
public:
   Time(int hours, int minutes);
   int hours() const;
   int minutes() const;
};
Time operator+(Time const & lhs, Time const & rhs) {
   return Time(lhs.hours()+rhs.hours(), lhs.minutes()+rhs.minutes());
}

友情は関係ありません。

于 2013-03-16T01:33:37.977 に答える