[] ব্যবহার করার সময় কেন সি ++ ম্যাপের ধরণের যুক্তির জন্য খালি নির্মাতার প্রয়োজন?


101

আরও দেখুন C ++ স্ট্যান্ডার্ডের তালিকা এবং ডিফল্ট-অঙ্কনযোগ্য ধরনের

কোনও প্রধান সমস্যা নয়, কেবল বিরক্তিকর কারণ আমি চাই না যে আমার ক্লাসটি নির্দিষ্ট যুক্তি ছাড়াই কখনও তাত্ক্ষণিকভাবে চালু করা হোক।

#include <map>

struct MyClass
{
    MyClass(int t);
};

int main() {
    std::map<int, MyClass> myMap;
    myMap[14] = MyClass(42);
}

এটি আমাকে নীচের জি ++ ত্রুটি দেয়:

/usr/incolve/c++/4.3/bit/stl_map.h:419: ত্রুটি: 'মাই ক্লাস ()' এ কল করার জন্য কোনও মিলছে না

আমি একটি ডিফল্ট নির্মাণকারী যুক্ত করলে এটি সূক্ষ্ম সংকলন করে; আমি নিশ্চিত এটি ভুল সিনট্যাক্সের কারণে নয়।


উপরের কোডটি MinGW (g ++ 3.4.5) এবং এমএসভিসি ++ ২০০৮ এ ঠিক জরিমানা সংকলন করে, মাইটাইপের জন্য একটি টাইপডেফ দেওয়া হয়েছে এবং ক্লাসের শেষে একটি সেমিকোলন সংযুক্ত করা হয়েছে। আপনি অবশ্যই অন্য কিছু করছেন (যেমন বিবি দ্বারা উল্লিখিত কলিং অপারেটর]] - দয়া করে পুরো কোডটি পোস্ট করুন ।
j_random_hacker

আহ, হ্যাঁ, আপনি ঠিক বলেছেন। করব.
নিক বোল্টন

হ্যাঁ, মাইম্যাপ ব্যবহার ছাড়াই আপনি জানেন না মানচিত্র শ্রেণীর জন্য কী সংকলন করা দরকার। কোন স্টাইল গ্রন্থাগার সরবরাহকারী এবং সংস্করণ এছাড়াও সাহায্য করতে পারে।
গ্রেগ ডোমজান

উত্তর:


168

এই সমস্যাটি অপারেটরের সাথে আসে []। এসজিআই ডকুমেন্টেশন থেকে উদ্ধৃতি:

data_type& operator[](const key_type& k)- নির্দিষ্ট কীটির সাথে সম্পর্কিত এমন বস্তুর একটি রেফারেন্স প্রদান করে। যদি মানচিত্রে ইতিমধ্যে কোনও অবজেক্ট না থাকে operator[] তবে ডিফল্ট বস্তুটি সন্নিবেশ করান data_type()

যদি আপনার ডিফল্ট কনস্ট্রাক্টর না থাকে তবে আপনি সন্নিবেশ / ফাংশন সন্ধান করতে পারেন। নিম্নলিখিত উদাহরণটি ভাল কাজ করে:

myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;

11
দুর্দান্ত উত্তর - এর emplaceসংক্ষিপ্ত বিকল্প হিসাবে C ++ 11 এও নোট করুন insert
গর্বিত

4
কেন std::<map>::value_typeসেখানে insertকল আছে?
থমথম

4
ডিফল্ট নির্মাতাকে কেন ব্যবহারকারী সংজ্ঞায়িত করা দরকার?
স্কুয়েস

@ শ্যুয়েস আমি এটি করার কোনও কারণ দেখতে পাচ্ছি না: = defaultঠিক কাজ করা উচিত।
আন্ডারস্কোর_

শর্ত 'মানচিত্রে ইতিমধ্যে এই জাতীয় কোনও वस्तू নেই' রানটাইমের সময় মূল্যায়ন করা হবে। একটি সংকলন সময় ত্রুটি কেন?
গৌরব সিং

7

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

এটি (এবং অন্যদের প্রয়োজনীয়তা) ব্যতীত এসটিএল কনটেইনারগুলি প্রয়োগ করা হয় এমন ডেটা স্ট্রাকচারের বিভিন্ন অভ্যন্তরীণ অনুলিপি / মুভ / অদলবদল / তুলনা অপারেশনগুলি প্রয়োগ করা অকারণে শক্ত হবে।

সি ++ স্ট্যান্ডার্ডের বিষয়ে উল্লেখ করার পরে, আমি দেখছি আমার উত্তরটি সঠিক ছিল না। ডিফল্ট-নির্মাণ আসলে প্রয়োজন হয় না :

20.1.4.1 থেকে:

ডিফল্ট নির্মাণকারী প্রয়োজন হয় না। কিছু ধারক শ্রেণীর সদস্য ফাংশন স্বাক্ষরগুলি ডিফল্ট যুক্তি হিসাবে ডিফল্ট কনস্ট্রাক্টরকে নির্দিষ্ট করে। টি () অবশ্যই একটি সংজ্ঞায়িত এক্সপ্রেশন হতে হবে ...

সুতরাং, কঠোরভাবে বলতে গেলে, আপনার মানের ধরণটি কেবল তখনই ডিফল্ট গঠনযোগ্য হতে হবে যদি আপনি তার ধারকটির এমন কোনও ফাংশন ব্যবহার করেন যা তার স্বাক্ষরে ডিফল্ট কনস্ট্রাক্টর ব্যবহার করে।

এসটিএল পাত্রে সঞ্চিত সমস্ত মান থেকে আসল প্রয়োজনীয়তা (23.1.3) CopyConstructibleএবং Assignable

নির্দিষ্ট পাত্রে অন্যান্য নির্দিষ্ট প্রয়োজনীয়তাও রয়েছে যেমন যেমন Comparable(যেমন কোনও মানচিত্রে কীগুলির জন্য)।


উল্লেখ্য, কোন ত্রুটি সহ নিম্নলিখিত প্রনয়ন Comeau :

#include <map>

class MyClass
{
public:
    MyClass(int t);
};

int main()
{
    std::map<int, MyClass> myMap;
}

সুতরাং এটি একটি জি ++ সমস্যা হতে পারে।


4
আপনি কি মনে করেন বিবি অপারেটর সম্পর্কিত কোনও বিষয় হতে পারে?
নিক বোল্টন

13
এই কোডটি সম্ভবত সংকলিত হয়েছে কারণ আপনি আমার ম্যাপকে কল করছেন না []
jfritz42

4

Stl :: মানচিত্রের সঞ্চিত প্রকারের প্রয়োজনীয়তা পরীক্ষা করুন। অনেক স্টাইল সংগ্রহের প্রয়োজন হয় যে সঞ্চিত ধরণের কিছু নির্দিষ্ট বৈশিষ্ট্য রয়েছে (ডিফল্ট কনস্ট্রাক্টর, অনুলিপি নির্মাণকারী, ইত্যাদি)।

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


-2

পরীক্ষা করুন কিনা:

  • আপনি '' 'ভুলে গেছেন ক্লাস ঘোষণার পরে।
  • মাইটাইপটি সেই অনুযায়ী ঘোষণা করা উচিত ছিল।
  • সেখানে কোনও ডিফল্ট নির্মাতা নেই ...

আমার মনে হয় স্ট্যান্ড :: মানচিত্রের ঘোষণাটি সঠিক বলে মনে হচ্ছে।


আমি একটি ডিফল্ট কনস্ট্রাক্টর যুক্ত করে জরিমানা সংকলন করি।
নিক বোল্টন

-2

সর্বাধিক সম্ভবত কারণ std :: জোড়া এর প্রয়োজন। স্ট্যান্ড :: জোড় দুটি মানের মান শব্দার্থক ব্যবহার করে যাতে আপনার পরামিতি ছাড়াই তা ইনস্ট্যান্ট করতে সক্ষম হওয়া দরকার need সুতরাং কোডটি স্টাড :: জোড়কে বিভিন্ন স্থানে কলারের কাছে মানচিত্রের মানগুলি ফেরত পাঠাতে ব্যবহার করে এবং এটি সাধারণত একটি খালি জোড় ইনস্ট্যান্ট করে এবং স্থানীয় জুটিকে ফেরত দেওয়ার আগে মানগুলিকে নির্ধারণ করে এটি করা হয়।

আপনি << int, smartptr <MyClass>> মানচিত্র ব্যবহার করে স্মার্ট পয়েন্টার সহ এটি পেতে পারেন তবে এটি নাল পয়েন্টারগুলির জন্য পরীক্ষার ওভারহেড যুক্ত করে।


4
+0 জোড়া <টি, ইউ> টি টি এবং ইউ টাইপের সাথে জরিমানা ব্যবহার করা যেতে পারে ডিফল্ট নির্মাতাদের অভাব - একমাত্র জিনিস যা এই ক্ষেত্রে ব্যবহার করা যায় না তা হ'ল জোড় <টি, ইউ> এর নিজস্ব ডিফল্ট কনস্ট্রাক্টর। <K, V> মানচিত্রের কোনও শালীন মানের বাস্তবায়ন এই ডিফল্ট নির্মাতাকে ব্যবহার করবে না কারণ এটি কে ও ভি কী হতে পারে তা সীমাবদ্ধ করে।
j_random_hacker
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.