isEqualTo関数テンプレートは長い間通過できませんでしたが、さすがに小媛が抜けすぎたのか、それとも量が多すぎたのか、いろいろな謎が本題の周りをめぐっています.Jineと一緒に謎の背後にあるサスペンスを探ってみましょう.

17116 ワード

原題は以下の通りである.
判断関数isEqualToのために簡単な関数テンプレートを作成してください.isEqualTo関数は等号演算子(==)を利用して2つの同型のパラメータが等しいかどうかを判断し、等しい場合はtrueを返します.逆にfalseを返します.メイン関数では、関数テンプレートを使用して、isEqualTo関数を複数の組み込みデータ型(int/char/double)に呼び出します.次に、2つのデータ・メンバーを持つSomeclassクラスを定義します.クラスに必要なメンバー関数を追加して、メイン関数でisEqualTo関数を呼び出して2つのオブジェクトが等しいかどうかを判断できるようにしてください.テスト例は次のとおりです.
Sample Input:
3 5
d t
3.5 7.8
2 5.6
Sample Output:
3 and 5 are not equal
d and t are not equal
3.5 and 7.8 are not equal
The class objects (1,1.1) and (2,5.6) are not equal
Sample Input:
2 4
d D
1.2 1.2
1 1.1
Sample Output:
2 and 4 are not equal
d and D are not equal
1.2 and 1.2 are equal
The class objects (1,1.1) and (1,1.1) are equal

そして書き始めましょう.真剣に考えて書いたソースコード:
#include
using namespace std;

template<typename T>
bool isEqualTo(T& x,T& y)
{
     
	if(x==y) return true;
	else  return false;
}
//    
class SomeClass
{
     
public:
	int x;
	double y;
	SomeClass(int xx=0,double yy=0){
     x=xx;y=yy;}
	
	bool operator==(SomeClass& z);
	friend istream& operator>>(istream &in ,const SomeClass &z);
	friend ostream& operator<<(ostream &out ,const SomeClass &m);

};
istream& operator>>(istream &in ,const SomeClass &z){
     
	in>>z.x>>z.y;
	return in;
}
ostream& operator<<(ostream &out ,const SomeClass &m){
     
	out<<"("<<m.x<<","<<m.y<<")";
}

bool SomeClass:: operator==(SomeClass& z)
{
     
	if(z.x==x&&z.y==y) return 1;
	else return 0;
}

int main()
{
     
    int a;   // integers used for
    int b;   // testing equality
    
    // test if two ints input by user are equal
//    cout << "Enter two integer values: ";
    cin >> a >> b;
    
    char c;  // chars used for
    char d;  // testing equality
    
    // test if two chars input by user are equal
//    cout << "
Enter two character values: ";
cin >> c >> d; double e; // double values used for double f; // testing equality // test if two doubles input by user are equal // cout << "
Enter two double values: ";
cin >> e >> f; SomeClass g( 1, 1.1 ); // SomeClass objects used SomeClass h; // for testing equality cin >> h; cout << a << " and " << b << " are " << ( isEqualTo( a, b ) ? "equal" : "not equal" ) << '
'
; cout << c << " and " << d << " are " << ( isEqualTo( c, d ) ? "equal" : "not equal" ) << '
'
; cout << e << " and " << f << " are " << ( isEqualTo( e, f ) ? "equal" : "not equal") << '
'
; // test if two SomeClass objects are equal // uses overloaded << operator cout << "The class objects " << g << " and " << h << " are " << ( isEqualTo( g, h ) ? "equal" : "not equal" ) << '
'
; return 0; } // end main

すでに大功を成し遂げたように見えて、書き終わった後、媛さんはお茶を飲んで、彼女は知っていて、事はそんなに簡単ではありません.すると,ローカルコンパイルが通過すると,実行時に3組の数を入力すると自動的に終了する.新しいドロップダウン頭脳嵐の後(実際には1、2時間変更しても効果がないので、勝手に試してみてください)やっと発見しました:ストリーム演算子>>を再ロードするとconstが削除され、4番目のグループ数を入力してisEqualTo関数テンプレート機能を完了することができます.
**~~~~~~~~~~~~~**分离符:よし、媛ちゃんは明日のc++期末试験に行くつもりだ.试験が终わったら、彼女の奇(diao)妙(fa)の旅を语る.
2020/06/19更新~~~来ました~おとといc++を受験して、また一日の魚を触って、やっと暑さ(xue)休暇(xi)を取りますが、その前にこの問題を書き終わります:まず問題全体の詳細な考え方を振り返ります:問題の意味によって、まず関数テンプレートを利用してisEqualTo関数を書きます.後でそれを利用して真偽を判断するので、boolタイプと定義します.SomeClassクラスには、データメンバー、コンストラクタ、==オペレータリロード、入出力ストリームリロードがあります.ここで、==オペレータのリロードは、関数テンプレートでSomeClassタイプの等しい判定を自分で定義する必要があるため、戻り値はboolタイプのままです.問題が発生しました.対流入力演算子<
**まとめ:
小さいながら役に立つ知識点:私たちの先生は「constを追加しても追加しなくてもいいときは、追加したほうがいい」と言ったことがあります.間違いなく、constを追加することはデータの安全性に有利ですが、ストリームを再ロードして演算子を入力するとき、受け入れたパラメータは修正する必要があるため、パラメータにconstを追加することはできません.最後に、この記事を参照して、演算子のリロードにおけるconstの詳細な分析を行います.
https://blog.csdn.net/weixin_43734095/article/details/104465307
最後の最後(* ̄) ̄)、不適切な点があれば批判指摘を歓迎します.