রেফারেন্স দ্বারা একটি যুক্তি পাস করার দুটি কারণ রয়েছে: (১) পারফরম্যান্সের জন্য (যে ক্ষেত্রে আপনি কনস্টের্ট রেফারেন্স দিয়ে পাস করতে চান) এবং (২) কারণ আপনাকে ফাংশনের অভ্যন্তরে যুক্তির মান পরিবর্তন করার দক্ষতা প্রয়োজন need
আমি অত্যন্ত সন্দেহ করি যে আধুনিক স্থাপত্যগুলিতে স্বাক্ষরবিহীন দীর্ঘ অতিক্রম করা আপনাকে খুব কমিয়ে দিচ্ছে। সুতরাং আমি ধরে নিচ্ছি যে আপনি State
পদ্ধতির অভ্যন্তরের মান পরিবর্তন করতে চাইছেন। 0
সংকলকটি অভিযোগ করছে কারণ ধ্রুবকটি পরিবর্তন করা যায় না, কারণ এটি একটি মূল্য (ত্রুটি বার্তায় "অ-মূল্যবান") এবং অপরিবর্তনীয় (const
ত্রুটির বার্তায়)।
সরল কথায় বলতে গেলে, আপনি এমন একটি পদ্ধতি চান যা পাস করা যুক্তিটি পরিবর্তন করতে পারে তবে ডিফল্টরূপে আপনি এমন একটি যুক্তি পাস করতে চান যা পরিবর্তন করতে পারে না।
এটিকে অন্য উপায়ে বলতে গেলে, অ- const
রেফারেন্সগুলিকে প্রকৃত ভেরিয়েবলগুলি উল্লেখ করতে হয়। ফাংশন সিগনেচারের ডিফল্ট মান ( 0
) একটি আসল পরিবর্তনশীল নয়। আপনি একই সমস্যার মধ্যে চলেছেন:
struct Foo {
virtual ULONG Write(ULONG& State, bool sequence = true);
};
Foo f;
ULONG s = 5;
f.Write(s); // perfectly OK, because s is a real variable
f.Write(0); // compiler error, 0 is not a real variable
// if the value of 0 were changed in the function,
// I would have no way to refer to the new value
যদি আপনি আসলে State
পদ্ধতির অভ্যন্তরে পরিবর্তন করতে চান না তবে আপনি কেবল এটিকে এটিকে পরিবর্তন করতে পারেন const ULONG&
। তবে আপনি এটি থেকে কোনও বড় পারফরম্যান্স সুবিধা পাবেন না, তাই আমি এটিকে একটি অ-রেফারেন্সে পরিবর্তনের পরামর্শ দেব ULONG
। আমি লক্ষ্য করেছি যে আপনি ইতিমধ্যে একটি ফিরে আসছেন ULONG
, এবং আমার কাছে একটি লুক্কায়িত সন্দেহ আছে যে State
কোনও মান প্রয়োজনীয় সংশোধন করার পরে এর মান value কোন ক্ষেত্রে আমি পদ্ধতিটি কেবল তাই ঘোষণা করব:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
আপনি কী লিখছেন বা কোথায় লিখছেন তা অবশ্যই নিশ্চিত নই। তবে এটি অন্য সময়ের জন্য আরেকটি প্রশ্ন।