সি ++ 20 এ মনোনীত প্রারম্ভিক


25

আমি C ++ 20 বৈশিষ্ট্য এক সম্পর্কে একটি প্রশ্ন, মনোনীত initializers (এই বৈশিষ্ট্যটি সম্পর্কে আরও তথ্য পেয়েছেন এখানে )

#include <iostream>

constexpr unsigned DEFAULT_SALARY {10000};

struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed
    std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true is printed

    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // it's ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile, WHY ?

    // For e2 compiler prints a warning "missing initializer for member 'Employee::<anonymous>' [-Wmissing-field-initializers]"
    Employee e2 {.salary{55000}}; 
}

এই কোডটি gcc 9.2.0 এবং -Wall -Wextra -std=gnu++2aপতাকা সহ সংকলিত হয়েছিল ।

আপনি উপরের দেখতে পাচ্ছেন, উভয় স্ট্রাক্ট Personএবং Employeeসমষ্টিগত তবে Employeeনির্ধারিত আরম্ভকারী ব্যবহার করে সমষ্টিটির সূচনা সম্ভব নয় of

কেউ আমাকে কেন ব্যাখ্যা করতে পারেন?


আমি জানি না এটি আপনার সমস্যার সমাধান করে কিনা, তবে আপনি এখানে সর্বজনীনভাবে উত্তরাধিকারী হতে পারবেন না ...struct Employee : public Person
skratchi.at


@ জিসার্গ ঠিক আছে, আমি ... যেহেতু আমি publicবা privateপ্রতিবার ব্যবহার করি ... যেহেতু আমি এ নিয়ে কোনও চিন্তা কখনই নষ্ট করি না ... যাইহোক ধন্যবাদ
skratchi.at

আপনার সঠিক ত্রুটিটি আপনি কী পেয়েছেন ??
skratchi.at

2
@ skratchi.at structগুলি সর্বজনীনভাবে ডিফল্টরূপে উত্তরাধিকারী
idclev 463035818

উত্তর:


15

সি ++ ২০ স্ট্যান্ডার্ড অনুযায়ী (9.3.1 সমষ্টিগুলি। পি। # 3)

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

সুতরাং আপনি বেস শ্রেণীর ডেটা সদস্যদের আরম্ভ করার জন্য মনোনীত প্রারম্ভিক তালিকাটি ব্যবহার করতে পারবেন না।

পরিবর্তে সাধারণ তালিকা আরম্ভের মতো ব্যবহার করুন

Employee e1{ "John", "Wick", 40, 50000 };

অথবা

Employee e1{ { "John", "Wick", 40 }, 50000 };

বা @ জারোড 42 কোনও মন্তব্যে নির্দেশিত হিসাবে আপনি লিখতে পারেন

Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };

এক্ষেত্রে প্রত্যক্ষ বেস শ্রেণি নির্ধারিত প্রাথমিকের তালিকা দ্বারা আরম্ভ করা হয় যখন পুরো বিভাগের কর্মচারী একটি অ-মনোনীত আরম্ভকারী তালিকার মাধ্যমে সূচনা হয়।


3
অথবা একটি মিশ্রণ: Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
জারোড 42

@ জারোড 42 হ্যাঁ, এটি সংকলন করে।
মস্কো থেকে ভ্লাদ,

5

আপনার বিভিন্ন বেস থেকে একই নামে একাধিক ক্ষেত্র থাকতে পারে,

সুতরাং যুক্তিযুক্তভাবে, আপনার পছন্দসই বেসটির নাম দেওয়া উচিত, তবে মনে হয় এটি করার কোনও উপায় নেই।

// Invalid too:
Employee e1{.Person.name{"John"}, .Person.surname{"Wick"}, .Person.age{40}, .salary{50000}};
Employee e2{.Person{.name{"John"}, .surname{"Wick"}, .age{40}}, .salary{50000}};

এ ছাড়া সি ++ মনোনীত সূচনাটি সি এর চেয়ে বেশি সীমাবদ্ধ:

দ্রষ্টব্য: আউট-অফ-অর্ডার নির্ধারিত সূচনা, নেস্টেড মনোনীত ইনিশিয়ালাইজেশন, মনোনীত ইনিশিয়ালাইজারস এবং নিয়মিত ইনিশিয়েলাইজার্সের মিশ্রণ এবং অ্যারেগুলির মনোনীত ইনিশিয়ালাইজেশন সমস্তই সি প্রোগ্রামিং ভাষায় সমর্থিত, তবে সি ++ এ অনুমোদিত নয়।

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