c++ - অবজ - সি প্লাস প্লাস pdf
কেন 'অপারেটর>' এর জন্য কনস্টের প্রয়োজন তবে 'অপারেটর<' এর জন্য নয়? (2)
কোডের এই অংশটি বিবেচনা করুন:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct MyStruct
{
int key;
std::string stringValue;
MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
bool operator < (const MyStruct& other) {
return (key < other.key);
}
};
int main() {
std::vector < MyStruct > vec;
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
std::sort(vec.begin(), vec.end());
for (const MyStruct& a : vec) {
cout << a.key << ": " << a.stringValue << endl;
}
}
এটি সূক্ষ্ম সংকলন করে এবং আউটপুটটি আশা করে gives তবে যদি আমি কাঠামোগত উতর ক্রম অনুসারে বাছাই করার চেষ্টা করি:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct MyStruct
{
int key;
std::string stringValue;
MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
bool operator > (const MyStruct& other) {
return (key > other.key);
}
};
int main() {
std::vector < MyStruct > vec;
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
std::sort(vec.begin(), vec.end(), greater<MyStruct>());
for (const MyStruct& a : vec) {
cout << a.key << ": " << a.stringValue << endl;
}
}
এটি আমাকে একটি ত্রুটি দেয়। এখানে সম্পূর্ণ বার্তা :
/usr/include/c++/7.2.0/bits/stl_function.h: 'কনস্টেক্সপ্রুল বুল স্ট্যান্ড :: বৃহত্তর <_Tp> :: অপারেটর () কনস্ট্যাক্ট_পিপি এবং, কনস্ট্রেট_পিএপ &) কনস্ট [[পিপি = মাইস্ট্রাক্ট]] সহ' :
/usr/incolve/c++/7.2.0/bits/stl_function.h:376:20: ত্রুটি: 'অপারেটর>' এর সাথে কোনও মিল নেই (অপরেনডের ধরণগুলি হ'ল 'কনস্ট মাইস্ট্রাক' এবং 'কনস্ট মাইস্ট্রাক')
{রিটার্ন __x> __y; }
দেখে মনে হচ্ছে কারণ এই
const
এখানে
const
কোয়ালিফায়ার নেই:
bool operator > (const MyStruct& other) {
return (key > other.key);
}
আমি যদি এটি যুক্ত করি,
bool operator > (const MyStruct& other) const {
return (key > other.key);
}
তারপরে আবার সবকিছু ঠিক আছে।
কেন এমন হয়?
অপারেটর ওভারলোডিংয়ের সাথে আমি খুব বেশি পরিচিত নই, তাই আমি কেবল এটিকে স্মৃতিতে রেখেছি যে আমাদের
const
যুক্ত করতে হবে তবে এটি কেন
const
operator<
ছাড়াই
operator<
জন্য কাজ করে।
আপনি পৃথক আচরণ পান কারণ আপনি বাস্তবে দুটি পৃথক (অতিরিক্ত বোঝা) sort কার্যকারিতা কল করছেন।
প্রথম ক্ষেত্রে আপনি দুটি পরামিতি
std::sort
কল করুন যা
operator<
সরাসরি ব্যবহার করে।
যেহেতু আপনার ভেক্টর উপাদানগুলিতে পুনরাবৃত্তিগুলি অবিচ্ছিন্ন রেফারেন্স তৈরি করে, এটি
operator<
প্রয়োগ করতে পারে
operator<
ঠিক আছে ঠিক।
দ্বিতীয় ক্ষেত্রে, আপনি
std::sort
তিনটি প্যারামিটার সংস্করণ ব্যবহার করছেন।
যে একটি ফান্টর গ্রহণ করে।
আপনি
std::greater
পাস।
এবং সেই ফান্টারের একটি
operator()
ঘোষণা করা হয়েছে:
constexpr bool operator()( const T& lhs, const T& rhs ) const;
কনস্টের রেফারেন্সগুলি নোট করুন।
উল্লেখের সাথে তুলনা করার জন্য প্রয়োজনীয় উপাদানগুলি এটি আবদ্ধ করে।
সুতরাং আপনার নিজের
operator>
অবশ্যই কনস্ট সঠিক হতে হবে।
আপনি যদি
std::less
কল করেন তবে আপনার
operator<
একই ত্রুটি তৈরি করবে, কারণ এটি কনস্ট-সঠিক নয়।
std::sort(vec.begin(), vec.end())
কেবল
operator<
ফাংশনে নির্ভর করে।
এটি প্রয়োজন হয় না যে ফাংশন
const
অবজেক্টগুলির সাথে কাজ করতে সক্ষম হবে।
std::greater
, অন্যদিকে, ফাংশনটি
const
অবজেক্টগুলির সাথে কাজ করতে সক্ষম হওয়া প্রয়োজন।
আপনি যদি
std::less
ব্যবহার করেন তবে একই ধরণের সমস্যা দেখতে পাবেন, যেমন
std::sort(vec.begin(), vec.end(), std::less<MyStruct>())
।
এই বলে যে,
operator<
ফাংশন এবং
operator>
ফাংশনটি অ-সদস্য সদস্য ফাংশন হওয়ার কোনও কারণ নেই।
যে কোনও সদস্য ফাংশন যা সদস্যের ডেটা সংশোধন করে না তাকে
const
সদস্য ফাংশন করা উচিত।