কনস্ট্রাক্টর ইনিশিয়ালাইজারে সদস্য অ্যারে শুরু করা


100
class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

আমি বিশ্বাস করি এর কারণ হ'ল অ্যারেগুলি কেবল =বাক্য গঠন দিয়েই আরম্ভ করা যেতে পারে , তা হ'ল:

int arr[3] = {1,3,4};

প্রশ্ন

  1. আমি কি আমি কি করতে চান করতে পারেন কিভাবে (যে আরম্ভ একটি কন্সট্রাকটর মধ্যে একটি অ্যারের (শরীরের উপাদান বরাদ্দ না))। এটা কি সম্ভব?
  2. সি ++ 03 স্ট্যান্ডার্ড কি সিটার ইনিশিয়ালাইজারগুলিতে সমষ্টি (অ্যারে সহ) আরম্ভ করার বিষয়ে বিশেষ কিছু বলে? বা উপরের কোডটির অবৈধতা কিছু অন্যান্য নিয়মের একটি বাস্তবায়ন?
  3. সি ++ 0 এক্স প্রারম্ভক তালিকা কী সমস্যার সমাধান করে?

পিএস দয়া করে ভেক্টর, বুস্ট :: অ্যারে এবং অ্যারেগুলির মধ্যে তাদের শ্রেষ্ঠত্বের উল্লেখ করবেন না, যা সম্পর্কে আমি ভালভাবে অবগত।


আপনি কি স্থির আকারের অ্যারেগুলি বাড়ানোর বিষয়ে সচেতন, যা নির্মাণকারীকে সরবরাহ করে?
Benoît

4
@ বানোট: আমি আছি তবে সরল অ্যারে সম্পর্কে আমার জানা দরকার :)
আর্মেন ​​সিরুনিয়ান

উত্তর:


56
  1. আমি যা করতে চাই তা কীভাবে করতে পারি (তা হ'ল কোনও কনস্ট্রাক্টরের একটি অ্যারে শুরু করা (শরীরে উপাদানগুলি বরাদ্দ না করা))। এটা কি সম্ভব?

হ্যাঁ. এটি এমন একটি কাঠামো ব্যবহার করছে যাতে একটি অ্যারে রয়েছে। আপনি বলেছিলেন যে আপনি এটি সম্পর্কে ইতিমধ্যে জানেন, তবে তখন আমি প্রশ্নটি বুঝতে পারি না। এইভাবে, আপনি শরীরের কোনও অ্যাসাইনমেন্ট ছাড়াই কনস্ট্রাক্টরে একটি অ্যারে শুরু করবেন । এটি কি boost::arrayকরে।

সি ++ 03 স্ট্যান্ডার্ড কি সিটার ইনিশিয়ালাইজারগুলিতে সমষ্টি (অ্যারে সহ) আরম্ভ করার বিষয়ে বিশেষ কিছু বলে? বা উপরের কোডটির অবৈধতা কিছু অন্যান্য নিয়মের একটি বাস্তবায়ন?

একটি মেম-ইনিশিয়ালাইজার সরাসরি সূচনা ব্যবহার করে। এবং ধারা 8 এর বিধিগুলি এই ধরণের জিনিসকে নিষিদ্ধ করে। আমি নিম্নলিখিত কেস সম্পর্কে ঠিক নিশ্চিত নই, তবে কিছু সংকলক এটির অনুমতি দেয়।

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

আরও তথ্যের জন্য এই জিসিসি পিআর দেখুন ।

সি ++ 0 এক্স প্রারম্ভক তালিকা কী সমস্যার সমাধান করে?

হ্যাঁ তারা করে. তবে আপনার বাক্য গঠনটি অবৈধ, আমি মনে করি। তালিকা সূচনা বন্ধ করতে আপনাকে সরাসরি ব্রেস ব্যবহার করতে হবে

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

আমি লেখার সময় আমি হোঁচট খেয়েছি: char * const foo[6];ক্লাস মেম্বার। এর জন্য সি ++ 11 এ সংকলন করার জন্য প্রাথমিককরণ প্রয়োজন izer
JATothrim

33

সি ++ 98 অ্যারে শূন্য করা (বা নন-পিওডি উপাদানগুলির জন্য, মান-প্রাথমিককরণ) ব্যতীত অন্য কোনও জন্য সরাসরি সিনট্যাক্স সরবরাহ করে না। তার জন্য আপনি শুধু লিখুন C(): arr() {}

আমার বিষয় রজার পেট সি ++ 0 এক্স সমষ্টিগত সূচনার অভিযোগের সীমাবদ্ধতা সম্পর্কে ভুল, তবে আমি এটি সন্ধান করতে বা এটি পরীক্ষা করতে খুব অলস, এবং এটি কোনও ব্যাপার নয়, তাই না? সম্পাদনা : রজার "C ++ 03" সম্পর্কে কথা বলছিল, আমি এটিকে "C ++ 0x" হিসাবে ভুলভাবে লিখেছি। দুঃখিত, রজার ☺

আপনার বর্তমান কোডটির জন্য একটি সি ++ 98 কাজটি হ'ল অ্যারেটি একটিতে মুড়ে ফেলা structএবং এ জাতীয় স্ট্যাটিক ধ্রুবক থেকে এটি আরম্ভ করা। তথ্য যাইহোক কোথাও থাকতে হবে। কাফ বন্ধ এটি দেখতে এটি দেখতে পারেন:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};

আমি বললাম 0x এর কি সীমাবদ্ধতা রয়েছে?

@ রোগার: "সমষ্টিগত সূচনা ... কোনও সিটার প্রাথমিককরণের সাথে খাপ খায় না"। স্রেফ C ++ 0x খসড়া এন 3126 পরীক্ষা করা , mem12.5.2 / 1 -তে একটি মেম-ইনিশিয়ালাইজারের বাক্য গঠন, একটি ব্রেসড - আরআই -তালিকা ব্যবহার অন্তর্ভুক্ত ।
চিয়ার্স এবং এইচটিএইচ - Alf

6
আমার বাক্যের প্রথম দুটি শব্দ হ'ল সি ++ 03, ...

8

কার্যকারিতা:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};

3
  1. না, দুর্ভাগ্যক্রমে।
  2. ব্যাকরণ দ্বারা অনুমোদিত নয় (আপনি আরও নীচে) যেমনটি আপনি চান ঠিক তেমন করতে পারবেন না। আপনি কেবল কর্টোর মতো ইনিশিয়ালাইজেশন ব্যবহার করতে পারেন এবং যেমন আপনি জানেন, এটি অ্যারেতে প্রতিটি আইটেম আরম্ভ করার জন্য উপলভ্য নয়।
  3. আমি তাই বিশ্বাস করি, কারণ তারা বোর্ড জুড়ে অনেক কার্যকর উপায়ে আরম্ভকরণকে সাধারণীকরণ করে। তবে আমি বিশদ সম্পর্কে নিশ্চিত নই।

সি ++ 03 তে, সমষ্টিগত সূচনাটি কেবল নীচের মতো সিনট্যাক্সের সাথে প্রযোজ্য, যা অবশ্যই পৃথক বিবৃতি হওয়া উচিত এবং কোনও সিটার ইনিশিয়ালাইজারের সাথে খাপ খায় না।

T var = {...};


-3

আপনি কি আপনার কনস্ট্রাক্টরের ইনটসের অ্যারে শুরু করতে চান? এটি একটি স্ট্যাটিক অ্যারেতে নির্দেশ করুন।

class C 
{
public:
    int *cArray;

};

C::C {
    static int c_init[]{1,2,3};
    cArray = c_init;
}

4
এটি একটি খারাপ ধারণা, কারণ আপনি যদি সেই অ্যারে পরিবর্তন করেন তবে এটি শ্রেণীর সমস্ত দৃষ্টান্তের জন্য পরিবর্তিত হয়েছে।
মার্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.