কনস্ট (টি কনস্ট *) এ পয়েন্টার মোছা হচ্ছে


91

কনস্ট পয়েন্টার সম্পর্কিত আমার একটি প্রাথমিক প্রশ্ন আছে। কনস্ট পয়েন্টার ব্যবহার করে আমাকে কোনও নন-কনস্ট্যান্ড সদস্য ফাংশন কল করার অনুমতি নেই। তবে কনস্টেন্ট পয়েন্টারে আমাকে এটি করার অনুমতি দেওয়া হয়েছে:

delete p;

এটি ক্লাসের ডেস্ট্রাক্টরকে কল করবে যা মূলত একটি নিরপেক্ষ 'পদ্ধতি'। কেন এটি অনুমোদিত? এটি কি কেবল এটি সমর্থন করার জন্য:

delete this;

নাকি অন্য কোনও কারণ আছে?

উত্তর:


113

এটি সমর্থন করার জন্য:

// dynamically create object that cannot be changed
const Foo * f = new Foo;

// use const member functions here

// delete it
delete f;

তবে মনে রাখবেন যে সমস্যাটি গতিশীলভাবে তৈরি বস্তুর মধ্যে সীমাবদ্ধ নয়:

{
 const Foo f;
 // use it
} // destructor called here

কনস্ট্রাক্ট অবজেক্টগুলিতে যদি ডেস্ট্রাক্টরদের ডাকা না যায় আমরা কনস্টের অবজেক্টগুলি মোটেই ব্যবহার করতে পারি না।


21
আপনার সম্পাদনার সর্বশেষ জন্য +1। আমি মনে করি এটি সত্য কারণ। কনট অবজেক্টের জন্য স্বয়ংক্রিয় ডেস্ট্রাক্টর কল - প্রায় মুছুন এফ; যেখানে এফ - কনস্টের উপর পয়েন্টার।
বায়দা

const Foo * fবা Foo const * fফু-র কাছে কোনও দৃ const় পয়েন্টার নয়। এটি কন ফু কনস্টিটার। Foo * const f ফু-র প্রতি লক্ষ্য
ব্যবহারকারী 11373693

48

এটিকে এভাবে রাখুন - যদি অনুমতি না দেওয়া হয় তবে কনস্ট_কাস্ট ব্যবহার না করে কনস্টের অবজেক্টগুলি মোছার উপায় নেই।

শব্দার্থকভাবে, কনস্ট একটি ইঙ্গিত দেয় যে কোনও অব্যবহৃত হওয়া উচিত। এটি অবশ্য বোঝায় না যে বস্তুটি মোছা হবে না।


4
ধ্বংসকারীরা হিংসাত্মক উপায়ে বস্তুগুলিকে পরিবর্তন করতে পারে, তাই এটি 'অপরিবর্তনীয়' শব্দের কিছু অদ্ভুত ব্যবহার হতে হবে যা সম্পর্কে আমি আগে অবগত ছিল না ...
দার্থজিজকা

4
@ দার্থজিজকা না, ধ্বংসকারীরা আপনাকে এমন একটি রাজ্য থেকে নিয়ে যায় যেখানে কোনও বস্তু আছে, যেখানে নেই সেখানে। সি ++ "মিউটেশন" পরবর্তী
ধ্বংসটি

@ ক্যালাথ: স্ট্যান্ডার্ডটি আপনাকে অবজেক্টের দিকে তার ধ্বংসাত্মক শেষ হয়ে যাওয়ার পরে দেখার অনুমতি দেয় না, তবে অবশ্যই ধ্বংসের ফলে হওয়া পার্শ্ব প্রতিক্রিয়াগুলি আপনাকে দেখার অনুমতি দেওয়া হবে। সুতরাং পরিস্থিতি সহজেই 'অপরিবর্তনীয়' বস্তুর রূপান্তরকে পর্যবেক্ষণযোগ্য করে তোলার ব্যবস্থা করা যেতে পারে। মার্কিন যুক্তরাষ্ট্রে, লাশ না থাকলে খুনের বিচার করা মুশকিল, তবে এটি এখনও হত্যাকাণ্ড (এবং দোষী সাব্যস্ত হওয়ার পক্ষে অন্যান্য প্রমাণও থাকতে পারে)। একই পার্থক্য.
ডার্থগিজকা

6

কনস্ট পয়েন্টার ব্যবহার করে আমাকে কোনও নন-কনস্ট্যান্ড সদস্য ফাংশন কল করার অনুমতি নেই।

হ্যা, তুমি.

class Foo
{
public:
  void aNonConstMemberFunction();
};

Foo* const aConstPointer = new Foo;
aConstPointer->aNonConstMemberFunction(); // legal

const Foo* aPointerToConst = new Foo;
aPointerToConst->aNonConstMemberFunction(); // illegal

আপনি কোন কনস্ট্যান্ট অবজেক্টে কনস্ট পয়েন্টারকে কনস্ট্যান্ট পয়েন্টার দিয়ে কনস্ট্যান্ট পয়েন্টারকে কনস্টিউজড করেছেন।

যা বলে,

delete aConstPointer; // legal
delete aPointerToConst; // legal

এটি অন্য মুছে ফেলা বৈধ, এখানে ইতিমধ্যে অন্যান্য উত্তর দ্বারা ইতিমধ্যে বিবৃত।


5

কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরকে 'পদ্ধতি' হিসাবে দেখা উচিত নয়। ক্লাসের কোনও অবজেক্ট শুরু করতে এবং ছিঁড়ে ফেলার জন্য এগুলি বিশেষ নির্মাণ are

'কনস্ট পয়েন্টার' বলতে বোঝায় যে জীবিত অবস্থায় যখন অপারেশন করা হয় তখন অবজেক্টের অবস্থা পরিবর্তন হবে না।


5

এটি দেখার আরও একটি উপায়: কনস্ট পয়েন্টারটির সুনির্দিষ্ট অর্থ হ'ল আপনি সেই পয়েন্ট-টু অবজেক্টে পরিবর্তন করতে সক্ষম হবেন না যা ওই বা অন্য কোনও পয়েন্টার বা একই বস্তুর রেফারেন্সের মাধ্যমে দৃশ্যমান হবে। কিন্তু যখন কোনও বস্তু নিষ্ক্রিয় হয়, এখন মুছে ফেলা অবজেক্টের দ্বারা দখল করা ঠিকানার ঠিকানার অন্য সমস্ত পয়েন্টারগুলি আর সেই অবজেক্টের জন্য পয়েন্টার হয় না । তারা একই ঠিকানা সঞ্চয় করে, কিন্তু সেই ঠিকানাটি আর কোনও বস্তুর ঠিকানা নয় (আসলে এটি শীঘ্রই কোনও অন্য কোনও বস্তুর ঠিকানা হিসাবে পুনরায় ব্যবহার করা যেতে পারে)।

এই পার্থক্যটি আরও স্পষ্ট হবে যদি সি ++ এর পয়েন্টারগুলি দুর্বল রেফারেন্সগুলির মতো আচরণ করে, অর্থাৎ অবজেক্টটি ধ্বংস হওয়ার সাথে সাথেই এটিতে সমস্ত বিদ্যমান পয়েন্টার তত্ক্ষণাত সেট করা হবে 0। (এটি এমন এক ধরণের জিনিস যা রান টাইমের সময় সমস্ত সি ++ প্রোগ্রামের জন্য চাপিয়ে দেওয়ার জন্য খুব ব্যয়বহুল বলে বিবেচিত হয় এবং বাস্তবে এটি পুরোপুরি নির্ভরযোগ্য হওয়া অসম্ভব))

আপডেট : নয় বছর পরে এটি পড়া, এটি আইনজীবী-ইশ। আমি এখন আপনার আসল প্রতিক্রিয়া বোধগম্য। রূপান্তর অস্বীকার করার জন্য তবে ধ্বংসকে অনুমতি দেওয়া স্পষ্টতই সমস্যাযুক্ত। কনস্ট পয়েন্টার / রেফারেন্সের অন্তর্নিহিত চুক্তিটি হ'ল তাদের অস্তিত্ব লক্ষ্য অবজেক্টের ধ্বংস, বাধা স্বয়ংক্রিয় আবর্জনা সংগ্রহের ব্লক হিসাবে কাজ করবে।

এর সাধারণ সমাধানটি হ'ল পরিবর্তে অন্য যে কোনও ভাষা ব্যবহার করা।


যদি আপনি কনস্ট পয়েন্টার দ্বারা নির্দেশিত জিনিসগুলিকে ধ্বংস করতে না পারেন তবে আপনি কীভাবে std::unique_ptr<const T>এই জীবনের সমাপ্তির সাথে আচরণ করবেন ?
ক্যালিথ

@ ক্যালথ তখন সি ++ তে এর কোনও সমাধান হবে না। এটি সাধারণ সমস্যার কেবল একটি উদাহরণ: সি ++ এ কনস্ট সংশোধকটির অর্থ "আপনি লক্ষ্যটিকে পরিবর্তন করতে পারবেন না, এক অর্থে যেখানে আপনি এটি সম্পূর্ণরূপে নষ্ট করতে পারেন এবং এটির অন্যান্য সমস্ত উল্লেখগুলি অবৈধ এবং অপরিজ্ঞাত আচরণের উত্সগুলি রেন্ডার করতে পারেন"। এই কারণেই আমি মনে করি যে এই ধরণের প্রশ্নটি অন্যান্য ভাষাগুলি বিবেচনার অনুরোধ হিসাবে কাজ করা উচিত। এটিতে ইউবি হোল রয়েছে যা কোনও ভিন্ন মৌলিক পদ্ধতির গ্রহণ না করে সমাধান করা যায় না।
ড্যানিয়েল আরউইকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.