প্রতিনিধি নির্ধারক ব্যবহার করার সময় সদস্য সূচনা


98

আমি সি ++ 11 স্ট্যান্ডার্ডটি চেষ্টা করে শুরু করেছি এবং আমি এই প্রশ্নটি পেয়েছি যা বর্ণনা করে যে কীভাবে কোনও ডিআইএস পদ্ধতি বা মত না এড়াতে একই ক্লাসের অন্য সিটি থেকে আপনার সিটারকে কল করতে হবে describes এখন আমি কোড দিয়ে একই জিনিসটি চেষ্টা করছি যা দেখতে দেখতে এটি দেখতে:

এইচপি

class Tokenizer
{
public:
  Tokenizer();
  Tokenizer(std::stringstream *lines);
  virtual ~Tokenizer() {};
private:
  std::stringstream *lines;
};

সিপিপি:

Tokenizer::Tokenizer()
  : expected('=')
{
}

Tokenizer::Tokenizer(std::stringstream *lines)
  : Tokenizer(),
    lines(lines)
{
}

তবে এটি আমাকে ত্রুটি দিচ্ছে: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationআমি টোকেনাইজার () অংশটি তালিকার প্রথম এবং শেষ স্থানান্তরের চেষ্টা করেছি তবে তাতে কোনও লাভ হয়নি।

এর পিছনে কারণ কী এবং আমি কীভাবে এটি ঠিক করব? পরিবর্তে আমি lines(lines)শরীরে স্থানান্তরিত করার চেষ্টা করেছি this->lines = lines;এবং এটি ভাল কাজ করে। তবে আমি সত্যিই আরম্ভকারী তালিকাটি ব্যবহার করতে সক্ষম হতে চাই।

উত্তর:


120

আপনি যখন অন্য কোনও কনস্ট্রাক্টরকে সদস্য সূচনাটি অর্পণ করেন তখন এমন ধারণা নেওয়া হয় যে অন্য নির্মাণকর্তা সমস্ত সদস্যকে (যেমন আপনার উদাহরণের সদস্য সহ ) সম্পূর্ণরূপে অবজেক্টটি পুরোপুরি আরম্ভ করেন lines। অতএব আপনি আর কোনও সদস্যকে আরম্ভ করতে পারবেন না।

স্ট্যান্ডার্ডের প্রাসঙ্গিক উক্তিটি (জোর দেওয়া খনি):

(§12.6.2 / 6) একটি মেমো-ইনিশিয়ালাইজার-তালিকাটি নির্মাণকারীর শ্রেণীর অন্য কোনও কনস্ট্রাক্টরের কাছে কোনও শ্রেণি বা ডিক্লাইপ টাইপ ব্যবহার করতে পারে যা নির্মাণকারীর শ্রেণি নিজেই বোঝায়। যদি কোনও মেম-ইনিশিয়ালাইজার-আইডি কনস্ট্রাক্টরের ক্লাস নির্ধারণ করে তবে এটি কেবল মেম-ইনিশিয়ালাইজার হবে ; কনস্ট্রাক্টর একটি প্রতিনিধি কনস্ট্রাক্টর এবং এর দ্বারা নির্বাচিত কনস্ট্রাক্টর হ'ল টার্গেট কনস্ট্রাক্টর। [...]

আপনি প্রথমে আর্গুমেন্ট গ্রহণকারী কনস্ট্রাক্টরের সংস্করণটি সংজ্ঞায়িত করে কাজটি করতে পারেন :

Tokenizer::Tokenizer(std::stringstream *lines)
  : lines(lines)
{
}

এবং তারপরে প্রতিনিধি ব্যবহার করে ডিফল্ট নির্মাণকারীর সংজ্ঞা দিন:

Tokenizer::Tokenizer()
  : Tokenizer(nullptr)
{
}

একটি সাধারণ নিয়ম হিসাবে, আপনার কনস্ট্রাক্টরের সেই সংস্করণটি সম্পূর্ণরূপে নির্দিষ্ট করা উচিত যা আর্গুমেন্টের সর্বাধিক সংখ্যক পরিমাণ নেয় এবং তারপরে অন্যান্য সংস্করণগুলি থেকে প্রতিনিধিত্ব করুন (প্রতিনিধি দলের আর্গুমেন্ট হিসাবে পছন্দসই ডিফল্ট মানগুলি ব্যবহার করে)।


4
এটি প্রথমে পাল্টা স্বজ্ঞাত বলে মনে হচ্ছে তবে এটি আসলেই সহায়তা করছে!
করচকিডু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.