রেফারেন্সগুলির অ্যারেগুলি কেন অবৈধ?


149

নিম্নলিখিত কোডটি সংকলন করে না।

int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};

সি ++ স্ট্যান্ডার্ড এ সম্পর্কে কী বলে?

আমি জানি যে আমি এমন কোনও শ্রেণি ঘোষণা করতে পারলাম যাতে রেফারেন্স রয়েছে, তারপরে shown শ্রেণীর একটি অ্যারে তৈরি করুন, যেমন নীচে দেখানো হয়েছে। তবে আমি সত্যিই জানতে চাইছি কেন উপরের কোডটি সংকলন করে না।

struct cintref
{
    cintref(const int & ref) : ref(ref) {}
    operator const int &() { return ref; }
private:
    const int & ref;
    void operator=(const cintref &);
};

int main() 
{
  int a=1,b=2,c=3;
  //typedef const int &  cintref;
  cintref arr[] = {a,b,c,8};
}

রেফারেন্সের অ্যারেটি অনুকরণ করার struct cintrefপরিবর্তে ব্যবহার করা সম্ভব const int &


1
অ্যারেটি বৈধ হলেও এটিতে কোনও কাঁচা '8' মান সংরক্ষণ করা কাজ করবে না। যদি আপনি "ইনট্লিংক মান = 8;" করেন, তবে এটি মারাত্মকভাবে মারা যাবে, কারণ এটি কেবলমাত্র "কনট ইন্টি & মান = 8;" তে অনুবাদ হয়েছে। একটি রেফারেন্স অবশ্যই একটি চলক উল্লেখ করতে হবে।
গ্রান্ট পিটারস

3
intlink value = 8;কাজ করে আপনি বিশ্বাস না করে দেখুন কিনা।
অ্যালেক্সি মালিস্তভ

7
অ্যালেক্সি যেমন উল্লেখ করেছেন, কোনও নিয়মিত রেফারেন্সকে কোনও রেফারেন্সের সাথে আবদ্ধ করার জন্য এটি পুরোপুরি বৈধ।
অবাকর

1
যা কাজ করে না তা হ'ল operator=। তথ্যসূত্রগুলি পুনঃনির্ধারণ করা যায় না। যদি আপনি সত্যিই এই জাতীয় শব্দার্থবিদ্যা চান - যদিও আমি ব্যক্তিগতভাবে এমন কোনও পরিস্থিতি খুঁজে পাইনি যেখানে তারা ব্যবহারিকভাবে কার্যকর - তবে std::reference_wrapperএটি করার উপায় হবে, কারণ এটি আসলে একটি পয়েন্টার সঞ্চয় করে তবে রেফারেন্সের মতো সরবরাহ করেoperator এবং পুনরায় গবেষণার অনুমতি দেয় না। তবে আমি কেবল একটি পয়েন্টার ব্যবহার করব!
আন্ডারস্কোর_২

1
অপারেটর = প্রাইভেট এবং বাস্তবায়িত হয়নি, ওরফে সি ++ 11 এ = মুছুন।
জিমি হার্টজেল

উত্তর:


148

স্ট্যান্ডার্ড সম্পর্কে আপনার প্রশ্নের উত্তরে আমি সি ++ স্ট্যান্ডার্ড §8.3.2 / 4 উদ্ধৃত করতে পারি :

রেফারেন্সের জন্য কোনও রেফারেন্স, রেফারেন্সের অ্যারে এবং রেফারেন্সের কোনও পয়েন্টার থাকবে না ters


32
এখানে আর কি বলার আছে?
বহুগ্লাট

9
একই কারণে আমাদের পয়েন্টারের অ্যারে, একই তথ্য কিন্তু বিভিন্ন হ্যান্ডলিং আছে, রেফারেন্সের অ্যারে থাকতে হবে?
নিউ-রাহ

6
সংকলক বিকাশকারীগণ যদি কোনও এক্সটেনশান হিসাবে রেফারেন্সের অ্যারেগুলিকে অনুমতি দেওয়ার সিদ্ধান্ত নেন, তবে এটি কী সাফল্য হবে? বা কিছু বাস্তব সমস্যা রয়েছে - সম্ভবত দ্ব্যর্থক কোড - যা এই এক্সটেনশানটি সংজ্ঞায়িত করতে খুব বিভ্রান্ত করবে?
অ্যারন ম্যাকডেইড

23
@ অ্যারোনম্যাকডেইড আমি মনে করি যে আসল কারণটি - যা এই এবং এই জাতীয় আলোচনার থেকে সুস্পষ্টভাবে অনুপস্থিত - তা হ'ল যদি কারও উল্লেখের বিন্যাস থাকে তবে কীভাবে সম্ভবত কোনও উপাদানটির ঠিকানা এবং তার সম্পর্কিত অবস্থানের ঠিকানায় পার্থক্য হবে? অবিলম্বে আপত্তি নেই আপনি যে 'আপনি একটি অ্যারের / ধারক / যাই হোক না কেন একটি রেফারেন্স দূরে থাকতে পারে না' করতে পারেন করা একটি structএকমাত্র সদস্য রেফারেন্স। তবে এরপরে, আপনি এখন নামের জন্য একটি রেফারেন্স এবং পিতামাতার উভয়ই পেয়েছেন ... যার অর্থ এখন আপনি কোন ঠিকানাটি চান তা নির্বিঘ্নে বলতে পারবেন। সুস্পষ্ট বলে মনে হচ্ছে ... তাহলে কেন কেউ তা বলেনি?
আন্ডারস্কোর_২

95
@ পলিগ্লোট কেন এরWhat more is there to say? যুক্তি ? আমি সমস্ত স্ট্যান্ডার্ড সম্পর্কে, তবে কেবল এটি উদ্ধৃত করে এবং ধরে নিই যে আলোচনার সমাপ্তিটি মনে হয় ব্যবহারকারীদের সমালোচনামূলক চিন্তাকে ধ্বংস করার একটি নিশ্চিত আগুনের মতো - ভাষাটি বিকশিত হওয়ার কোনও সম্ভাবনার সাথে, যেমন বাদ দেওয়া সীমাবদ্ধতার বাইরেও বা কৃত্রিম সীমাবদ্ধতা অনেক বেশি 'কারণ স্ট্যান্ডার্ড' এখানে - এবং যথেষ্ট নয় 'বলে এবং এটি নীচের ব্যবহারিক কারণের কারণে বলা খুব বুদ্ধিমানের কাজ। আমি জানি না কেন উত্তরগুলি এত উত্তেজিতভাবে উত্তরগুলি প্রবাহিত করে যেগুলি কেবল উত্তরগুলি অন্বেষণ করার চেষ্টা না করে কেবলমাত্র পূর্ব বলে say
আন্ডারস্কোর_২

64

তথ্যসূত্র বস্তু নয়। তাদের নিজস্ব স্টোরেজ নেই, তারা কেবল বিদ্যমান বস্তুর উল্লেখ করে। এই কারণে রেফারেন্সগুলির অ্যারে থাকা কোনও অর্থবোধ করে না।

আপনি যদি হালকা ওজনের কোনও অবজেক্ট চান যা অন্য কোনও অবজেক্টের উল্লেখ করে তবে আপনি পয়েন্টার ব্যবহার করতে পারেন। আপনি কেবলমাত্র structরেফারেন্স সদস্যের সাথে একটি অ্যারেতে অবজেক্ট হিসাবে ব্যবহার করতে সক্ষম হবেন যদি আপনি সমস্ত structদৃষ্টান্তের জন্য সমস্ত রেফারেন্স সদস্যদের জন্য সুস্পষ্ট সূচনা প্রদান করেন । তথ্যসূত্রগুলি ডিফল্ট ইনটালাইজড করা যায় না।

সম্পাদনা: jia3ep নোট হিসাবে, ঘোষণার মানক বিভাগে রেফারেন্সগুলির অ্যারেগুলিতে সুস্পষ্ট নিষেধাজ্ঞা রয়েছে।


6
ধ্রুবক পয়েন্টার হিসাবে রেফারেন্সগুলি তাদের প্রকৃতিতে একই রকম এবং তাই কোনও কিছুর প্রতি নির্দেশ করতে তারা কিছু স্মৃতি (সঞ্চয়) গ্রহণ করে।
ইনাজারুক

7
অগত্যা নয়। সংকলক ঠিকানাটি স্টোর করা এড়াতে সক্ষম হতে পারে, যদি এটি উদাহরণস্বরূপ স্থানীয় বস্তুর কোনও রেফারেন্স হয়।
ইফ্রাইম

4
অগত্যা। কাঠামোর উল্লেখ সাধারণত কিছু সঞ্চয়স্থান গ্রহণ করে। স্থানীয় রেফারেন্স প্রায়শই হয় না। যেভাবেই হোক, কঠোর স্ট্যান্ডার্ড অর্থে, উল্লেখগুলি বস্তু নয় এবং (এটি আমার কাছে নতুন ছিল) নামের উল্লেখগুলি আসলে পরিবর্তনশীল নয়
সিবি বেইলি

26
হ্যাঁ, তবে এটি বাস্তবায়নের বিশদ। সি ++ মডেলের একটি অবজেক্ট স্টোরেজের একটি টাইপড অঞ্চল। একটি রেফারেন্স স্পষ্টভাবে কোনও বস্তু নয় এবং কোনও নির্দিষ্ট প্রসঙ্গে সঞ্চয়স্থান গ্রহণের কোনও গ্যারান্টি নেই।
সিবি বেইলি

9
এটি এইভাবে রাখুন: আপনার কাছে ফুফুদের 16 টি রেফস ছাড়া আর কোনও কাঠামো থাকতে পারে এবং আমি আমার রেফারির অ্যারেটি ব্যবহার করতে চাই ঠিক তেমনভাবে এটি ব্যবহার করতে পারি - আপনি 16 টি ফুফু রেফারেন্সে সূচি রাখতে পারবেন না সে ব্যতীত । এটি একটি ভাষার ওয়ার্ট আইএমএইচও।
গ্রেগো

28

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

struct mys {
 int & a;
 int & b;
 int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs.a += 3  ;  // add 3 to ivar1

বাস্তবে আপনি কাঠামো সংজ্ঞাতে এই লাইনটি যুক্ত করতে পারেন

struct mys {
 ...
 int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};

... এবং এখন আমার কাছে এমন কিছু আছে যা দেখতে প্রচুর পরিমাণে রেফারির মতো লাগে:

int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs[1] = my_refs[2]  ;  // copy arr[12] to ivar2
&my_refs[0];               // gives &my_refs.a == &ivar1

এখন, এটি আসল অ্যারে নয়, এটি অপারেটর ওভারলোড; উদাহরণস্বরূপ, অ্যারেগুলি সাধারণত মাপের (আরআর) / সাইজফ (আরআর [0]) এর মতো কাজগুলি করে না। তবে এটি পুরোপুরি আইনী সি ++ সহ আমি রেফারেন্সগুলির একটি অ্যারেটি করতে চাই ঠিক তা করে। (ক) ব্যতীত 3 বা 4 টিরও বেশি উপাদানের জন্য সেট আপ করতে ব্যথা হচ্ছে এবং (খ) এটি গুচ্ছ ব্যবহার করে একটি গণনা করছে?: যা সূচক ব্যবহার করে করা যেতে পারে (সাধারণ সি-পয়েন্টার-গণনা-শব্দার্থ সূচকগুলি দিয়ে নয়) , তবে তবুও সূচীকরণ)। আমি খুব সীমিত 'রেফারেন্সের অ্যারে' টাইপ দেখতে চাই যা আসলে এটি করতে পারে। অর্থাত্ রেফারেন্সের অ্যারেগুলিকে রেফারেন্সের জিনিসগুলির সাধারণ অ্যারে হিসাবে বিবেচনা করা হবে না, বরং এটি একটি নতুন 'অ্যারে-অফ-রেফারেন্স' হবে টেমপ্লেট দিয়ে তৈরি)।

এটি সম্ভবত কাজ করবে, যদি আপনি এই জাতীয় কদর্যতা মনে করেন না: '* এটি' কে ইনট * এর অ্যারে হিসাবে পুনরায় পোস্ট করুন এবং একটি থেকে তৈরি একটি রেফারেন্স ফিরিয়ে দিন: (প্রস্তাবিত নয়, তবে এটি সঠিক 'অ্যারে' কীভাবে দেখায় কাজ করবে):

 int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }

1
আপনি এটি সি ++ 11 এ করতে পারেন std::tuple<int&,int&,int&> abcref = std::tie( a,b,c)- যা একটি "অ্যারে" রেফারেন্স তৈরি করে যা কেবল স্টাইল :: গেট ব্যবহার করে সংকলন-সময় ধ্রুবক দ্বারা সূচক করা যেতে পারে। কিন্তু আপনি করতে পারবেন না std::array<int&,3> abcrefarr = std::tie( a,b,c)। এটি করার একটি উপায় আছে যা আমি জানি না। আমার কাছে মনে হয় এমন কোনও বিশেষায়নের লেখার একটি উপায় থাকা উচিত std::array<T&,N>যা এর এটি করতে পারে - এবং এইভাবে এমন একটি ফাংশন std::tiearray(...)যা এরকম একটি ফেরত দেয় (বা std::array<T&,N>ঠিকানাগুলির সাথে ইনিশিয়ালাইজার গ্রহণের অনুমতি দেয় =
initial

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

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

যথেষ্ট ফর্সা। তবে আমি মনে করি এই ধারণাটি "এটির মুখোমুখি" এবং এ কারণেই রেফারেন্সগুলির অ্যারেটি নিষিদ্ধ করা হয়। একটি অ্যারে হ'ল প্রথম এবং সর্বাগ্রে একটি ধারক। সমস্ত ধারক প্রয়োগ করার জন্য স্ট্যান্ডার্ড অ্যালগরিদমগুলির জন্য একটি পুনরাবৃত্তকারী ধরণের প্রয়োজন। "অ্যারের টি" এর জন্য পুনরাবৃত্তির ধরণটি সাধারণত "টি *" হয়। রেফারেন্সের অ্যারের জন্য পুনরাবৃত্তকারী টাইপটি কী হবে? এই সমস্ত সমস্যার মোকাবেলায় যে পরিমাণ ভাষা হ্যাকিং লাগবে তা মূলত অকেজো বৈশিষ্ট্যের জন্য হাস্যকর। প্রকৃতপক্ষে আমি এটি আমার নিজের একটি উত্তর করব :-)
নিমো

@ নেমো এটি মূল ভাষার অংশ হওয়ার দরকার নেই, সুতরাং পুনরাবৃত্তির ধরণটি 'কাস্টম' হওয়া কোনও বড় বিষয় নয়। সমস্ত বিভিন্ন ধারক প্রকারের তাদের পুনরুক্তি করার ধরণ রয়েছে। এই ক্ষেত্রে পুনরুক্তিযুক্ত, পুনরুক্তি করা হবে, অ্যারেতে রেফগুলি নয়, যা লক্ষ্য বিন্যাসের সাথে সম্পূর্ণ সুসংগত target এটি এখনও টেমপ্লেট হিসাবে সমর্থন করার জন্য কিছুটা নতুন সি ++ আচরণের প্রয়োজন হতে পারে খুব সাধারণ std::array<T,N>, সহজেই অ্যাপ কোডে সংজ্ঞায়িত, স্ট্যান্ড :: :: সি ++ 11 অবধি যুক্ত করা হয়নি, সম্ভবত এটির কোনও উপায় ছাড়াই এটি অনর্থক কারণ = {1,2,3};'ভাষা হ্যাকিং' কি ছিল?
গ্রেগগো 14

28

আপনার সম্পাদনা মন্তব্য:

আরও ভাল সমাধান std::reference_wrapper

বিশদ: http://www.cplusplus.com/references/functional/references_wrapper/

উদাহরণ:

#include <iostream>
#include <functional>
using namespace std;

int main() {
    int a=1,b=2,c=3,d=4;
    using intlink = std::reference_wrapper<int>;
    intlink arr[] = {a,b,c,d};
    return 0;
}

হাই এটি 09 এ ফিরে বলা হয়েছিল। নতুন পোস্টগুলির জন্য টিপ টিপস :)
স্ট্যাগান্ডার

9
পোস্টটি পুরানো তবে সবাই রেফারেন্স_ওয়ার্পার সহ সমাধান সম্পর্কে জানেন না। লোকেরা সি ++ 11 এর এসটিএল এবং এসটিডিলেব সম্পর্কে পড়তে হবে।
Youw

এটি ক্লাসের নাম উল্লেখ করার পরিবর্তে একটি লিঙ্ক এবং নমুনা কোড দেয় reference_wrapper
ডেভিড স্টোন

12

একটি অ্যারে সুস্পষ্টভাবে একটি পয়েন্টারে রূপান্তরযোগ্য এবং পয়েন্টার-থেকে-রেফারেন্স সি ++ এ অবৈধ


11
এটি সত্য যে আপনার কোনও রেফারেন্সের পয়েন্টার থাকতে পারে না তবে এটি কারণ নয় যে আপনার রেফারেন্সের অ্যারে থাকতে পারে না। বরং এগুলি উভয়ই লক্ষণের বিষয় যে উল্লেখগুলি বস্তু নয়।
রিচার্ড কর্ডেন

1
কোনও কাঠামোতে রেফারেন্স ছাড়া কিছুই থাকতে পারে এবং এর সংখ্যার সাথে এটির আকারের আনুপাতিক পরিমাণ থাকবে। আপনার যদি রেফারগুলির একটি অ্যারে থাকে তবে 'অ্যারে-থেকে-পয়েন্টার রূপান্তরটি কোনও অর্থবোধ করতে পারে না, যেহেতু' পয়েন্টার-টু-রেফারেন্স 'কোনও অর্থ দেয় না। তবে এটি কেবলমাত্র আরআর ব্যবহার করা বুদ্ধিমান হবে [i], একইভাবে st.ref হিসাবে যখন 'st' একটি স্ট্রাক্ট থাকে যখন রেফ থাকে। হুম। তবে & আরআর [0] প্রথম রেফারেন্সযুক্ত বস্তুর ঠিকানা দেবে, এবং & arr [1] - & আরআর [0] & আরআর [2] - এবং অ্যারে [1] এর মতো হবে না - এটি প্রচুর উদ্ভটতা তৈরি করবে।
গ্রেগো

11

দেওয়া হয়েছে int& arr[] = {a,b,c,8};, কী sizeof(*arr)?

অন্য কোথাও, একটি রেফারেন্সটিকে কেবল জিনিস হিসাবে বিবেচনা করা হয়, তাই sizeof(*arr)সহজভাবে হওয়া উচিত sizeof(int)। তবে এটি অ্যারে পয়েন্টারগুলিতে পাটিগণিতকে ভুল করে তোলে এই ধরণেরটিকে ভুল (ধরে নিলে যে রেফারেন্সগুলি একই প্রস্থগুলি অন্তর্নিহিত নয়)) অস্পষ্টতা দূর করতে, এটি নিষিদ্ধ।


হাঁ। কোনও আকার না থাকলে আপনার কোনও অ্যারে থাকতে পারে না। একটি রেফারেন্স আকার কি?
ডেভিড শোয়ার্টজ

4
@ ডেভিডশওয়ার্টজ একজন structরেফারেন্স করেছেন যার একমাত্র সদস্য সেই রেফারেন্স করে খুঁজে বের করুন ..?
আন্ডারস্কোর_ডি

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, বোকা পেডেন্টিকের নয় যা ওপিতে স্ট্যান্ডার্ডটি ছুঁড়ে দেয়।
টাইসন জ্যাকবস

টাইপো থাকতে পারে। "অনুমান যে রেফারেন্সগুলি একই প্রস্থ নয়, এটি" ইনটেন্স হিসাবে একই প্রস্থ নয় বলে ধরে নেওয়া উচিত "should পরিবর্তন হয় থেকে যেমন
heেঙ্গুওলি

তবে অপেক্ষা করুন, এই যুক্তি অনুসারে আপনার রেফারেন্স সদস্য ভেরিয়েবলগুলি থাকতে পারে না।
টাইসন জ্যাকবস 18

10

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

এর পরিবর্তে বুস্ট :: রেফারেন্স_ওয়ার্পার, বা বুস্ট :: টিপল ব্যবহার করুন; বা শুধু পয়েন্টার।


5

আমি বিশ্বাস করি উত্তরটি খুব সহজ এবং এটি সিফারেন্সের সিমেটিক নিয়মগুলির সাথে এবং কীভাবে অ্যারেগুলি সি ++ এ পরিচালনা করা হয় তার সাথে সম্পর্কিত।

সংক্ষেপে: রেফারেন্সগুলিকে স্ট্রাক্ট হিসাবে ভাবা যেতে পারে যার ডিফল্ট কনস্ট্রাক্টর নেই, সুতরাং সমস্ত একই বিধি প্রয়োগ হয়।

1) শব্দার্থকভাবে, উল্লেখগুলির একটি ডিফল্ট মান হয় না। শুধুমাত্র কিছু উল্লেখ করে রেফারেন্স তৈরি করা যায়। উল্লেখের অনুপস্থিতি উপস্থাপনের জন্য উল্লেখগুলির কোনও মূল্য নেই।

2) এক্স আকারের একটি অ্যারের বরাদ্দ করার সময়, প্রোগ্রামটি ডিফল্ট-আরম্ভীকৃত অবজেক্টগুলির একটি সংগ্রহ তৈরি করে। যেহেতু রেফারেন্সের ডিফল্ট মান থাকে না, তাই এই জাতীয় অ্যারে তৈরি করা শব্দার্থগতভাবে অবৈধ।

এই নিয়মটি স্ট্রাইক / ক্লাসগুলিতেও প্রযোজ্য যার ডিফল্ট নির্মাতা নেই। নিম্নলিখিত কোড নমুনা সংকলন করে না:

struct Object
{
    Object(int value) { }
};

Object objects[1]; // Error: no appropriate default constructor available

1
আপনি এর একটি অ্যারের তৈরি করতে পারেন Object, আপনি শুধু তাদের সবাইকে আরম্ভ করতে নিশ্চিত করতে হবে: Object objects[1] = {Object(42)};। এদিকে, আপনি সেগুলির সমস্ত সূচনা করেও আপনি রেফারেন্সের অ্যারে তৈরি করতে পারবেন না।
আন্তোন 3

4

আপনি এই টেমপ্লেট কাঠামোর সাথে মোটামুটি কাছাকাছি যেতে পারেন। যাইহোক, আপনাকে টিয়ের পরিবর্তে টিতে নির্দেশক যে অভিব্যক্তি দিয়ে শুরু করতে হবে; এবং তাই, আপনি একইভাবে সহজেই 'নকল_কন্ট্রিফ_আরে' বানাতে পারেন, তবে আপনি ওপি'র উদাহরণ ('8') এর মতো মূল্যবোধকে আবদ্ধ করতে পারবেন না;

#include <stdio.h>

template<class T, int N> 
struct fake_ref_array {
   T * ptrs[N];
  T & operator [] ( int i ){ return *ptrs[i]; }
};

int A,B,X[3];

void func( int j, int k)
{
  fake_ref_array<int,3> refarr = { &A, &B, &X[1] };
  refarr[j] = k;  // :-) 
   // You could probably make the following work using an overload of + that returns
   // a proxy that overloads *. Still not a real array though, so it would just be
   // stunt programming at that point.
   // *(refarr + j) = k  
}

int
main()
{
    func(1,7);  //B = 7
    func(2,8);     // X[1] = 8
    printf("A=%d B=%d X = {%d,%d,%d}\n", A,B,X[0],X[1],X[2]);
        return 0;
}

-> এ = 0 বি = 7 এক্স = {0,8,0}


2

একটি রেফারেন্স অবজেক্টের কোনও আকার নেই। আপনি যদি লিখেন তবে sizeof(referenceVariable)এটি আপনাকে রেফারেন্সের আকারের referenceVariableনয় বরং রেফারেন্সের আকারের আকার দেবে । এটির নিজস্ব কোনও আকার নেই, এ কারণেই সংকলক অ্যারেটির জন্য কত আকারের প্রয়োজন হবে তা গণনা করতে পারে না।


3
যদি তাই হয় তবে কিভাবে একটি সংকলক কেবল একটি রেফ থাকা স্ট্রাক্টের আকার গণনা করতে পারে?
জাস্টার

সংকলক কোনও রেফারেন্সের শারীরিক আকার জানতে পারে - এটি পয়েন্টারের মতো। তথ্যসূত্রগুলি আসলে শব্দার্থিকভাবে গৌরবযুক্ত পয়েন্টার। পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্য হ'ল রেফারেন্সগুলিতে পয়েন্টারগুলির তুলনায় আপনি যে বাগগুলি তৈরি করতে পারেন তা হ্রাস করতে রেফারেন্সগুলিতে বেশ কয়েকটি অর্থপূর্ণ নিয়ম রাখা হয়েছে।
ক্রিস্তুপাস এ।

2

আপনি যখন কোনও অ্যারেতে কিছু সঞ্চয় করেন, তখন এর আকারটি জানা দরকার (যেহেতু অ্যারে সূচকগুলি আকারের উপর নির্ভর করে)। সি ++ স্ট্যান্ডার্ড অনুযায়ী এটি কোনও নির্দিষ্ট রেফারেন্সের স্টোরেজ প্রয়োজন কিনা তা অনির্ধারিত, ফলস্বরূপ একটি রেফারেন্সের অ্যারেরকে সূচিযুক্ত করা সম্ভব হবে না।


1
তবে structএকটিতে রেফারেন্স রেখে , যাদুকরীভাবে সমস্ত কিছু নির্দিষ্ট, সংজ্ঞায়িত, গ্যারান্টিযুক্ত এবং নির্মূল আকারের হয়ে যায়। সুতরাং, কেন এই আপাতদৃষ্টিতে সম্পূর্ণ কৃত্রিম পার্থক্য বিদ্যমান?
আন্ডারস্কোর_২

... অবশ্যই, যদি কেউ আসলে মোড়কে কী সরবরাহ করে তা নিয়ে ভাবতে শুরু structকরে, তবে কিছু ভাল সম্ভাব্য উত্তর তাদের নিজেদের পরামর্শ দিতে শুরু করে - তবে আমার কাছে, এটি এখনও সকলের পক্ষে তাত্ক্ষণিক চ্যালেঞ্জগুলির মধ্যে একটি হয়েও এখনও কেউ তা করেনি has কেন আপনি মোড়কানো রেফ ব্যবহার করতে পারবেন না তার জন্য যুক্তি
আন্ডারস্কোর_ডি

2

শুধু সমস্ত কথোপকথনে যোগ করতে। যেহেতু অ্যারে আইটেমটি সংরক্ষণ করার জন্য একটানা মেমরি অবস্থানের প্রয়োজন হয়, সুতরাং আমরা যদি রেফারেন্সগুলির একটি অ্যারে তৈরি করি তবে এটি নিশ্চিত নয় যে তারা ক্রমাগত মেমরির অবস্থান করবে তাই অ্যাক্সেস করা সমস্যা হবে এবং তাই আমরা এমনকি সমস্ত গাণিতিক ক্রিয়াকলাপগুলি প্রয়োগ করতে পারি না অ্যারে।


মূল প্রশ্ন থেকে নীচের কোডটি বিবেচনা করুন: int a = 1, b = 2, c = 3; int & arr [] = {a, b, c, 8}; খুব কম সম্ভাবনা রয়েছে যে ক, খ, সি পরপর স্মৃতি অবস্থানের মধ্যে থাকবে।
অমিত কুমার

এটি একটি ধারকটিতে রেফারেন্স রাখার ধারণার মূল সমস্যা থেকে অনেক দূরে।
আন্ডারস্কোর_ডি

0

পয়েন্টার একটি অ্যারে বিবেচনা করুন। একটি পয়েন্টার আসলেই একটি ঠিকানা; সুতরাং আপনি অ্যারেটি শুরু করার সময় আপনি কম্পিউটারকে অ্যানালগভাবে বলছেন, "এই এক্স নম্বরগুলি রাখার জন্য এই মেমরির এই ব্লকটি বরাদ্দ করুন (যা অন্যান্য আইটেমের ঠিকানা)।" তারপরে আপনি যদি পয়েন্টারগুলির মধ্যে একটি পরিবর্তন করেন তবে আপনি কেবল এটি পরিবর্তন করছেন যা এটি নির্দেশ করে; এটি এখনও একটি সংখ্যাসূচক ঠিকানা যা নিজে একই জায়গায় বসে আছে।

একটি রেফারেন্স একটি উপনামের সাথে সাদৃশ্যপূর্ণ। আপনি যদি একটি রেফারেন্সের অ্যারে ঘোষণা করতে চান তবে আপনি মূলত কম্পিউটারকে বলবেন, "চারদিকে ছড়িয়ে ছিটিয়ে থাকা এই বিভিন্ন আইটেমের সমন্বিত মেমরির এই নিরাকার ব্লবটি বরাদ্দ করুন।"


1
তবে কেন, structযার একমাত্র সদস্যকে রেফারেন্স হিসাবে তৈরি করা পুরোপুরি আইনী, অনুমানযোগ্য এবং অ-নিরাকার কিছু করে? যাদুতে অ্যারে-সক্ষম ক্ষমতা অর্জনের জন্য কোনও ব্যবহারকারীকে কেন এটির জন্য একটি রেফারেন্স আবৃত করতে হবে, বা এটি কেবল একটি কৃত্রিম সীমাবদ্ধতা? আইএমওর কোনও উত্তরই সরাসরি এটিকে সম্বোধন করে নি। আমি প্রত্যাখ্যানটি হ'ল 'মোড়ানো বস্তুটি নিশ্চিত করে যে আপনি মোড়ানো বস্তুর আকারে মূল্য শব্দার্থক ব্যবহার করতে পারবেন , সুতরাং এটি আপনাকে প্রয়োজনীয় মানগুলির গ্যারান্টি থাকতে পারে তা নিশ্চিত করে কারণ উদাহরণস্বরূপ কীভাবে কোনও উপাদান এবং রেফারির ঠিকানার মধ্যে বিচ্ছিন্ন হয়ে যায়' ' ... তুমি কি বোঝাতে চেয়েছ?
আন্ডারস্কোর_২

-2

আসলে, এটি সি এবং সি ++ সিনট্যাক্সের মিশ্রণ।

আপনার হয় খাঁটি সি অ্যারে ব্যবহার করা উচিত , যা রেফারেন্স হতে পারে না, কারণ রেফারেন্স কেবল সি ++ এর অংশ। অথবা আপনি সি ++ পথে যান এবং নিজের উদ্দেশ্যে std::vectorবা std::arrayশ্রেণিটি ব্যবহার করেন ।

সম্পাদিত অংশ হিসাবে: যদিও এটি structসি থেকে একটি উপাদান, আপনি একটি কন্সট্রাক্টর এবং অপারেটর ফাংশন সংজ্ঞায়িত করেন, যা এটি একটি সি ++ করে তোলে class। ফলস্বরূপ, আপনার structখাঁটি সিতে সংকলন করা হবে না!


তোমার লক্ষ্যটা কি? std::vectorবা std::arrayরেফারেন্সও থাকতে পারে না। সি ++ স্ট্যান্ডার্ডটি বেশ স্পষ্ট যে কোনও ধারক পারে না।
আন্ডারস্কোর_২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.