'::' এর সাথে প্রতিস্থাপন করবে। 'সি ++ এ অস্পষ্টতা তৈরি করবেন?


95

সি ++ এ অপারেটরটি ::একটি नेमস্পেস বা শ্রেণিতে ক্লাস, ফাংশন এবং ভেরিয়েবল অ্যাক্সেস করতে ব্যবহৃত হয়।

যদি সেই ভাষার .পরিবর্তে ভাষার স্পেসিফিকেশন যদি ::কোনও বস্তুর উদাহরণ ভেরিয়েবল / পদ্ধতিগুলিতে অ্যাক্সেস করার সময়ও পছন্দ হয় তবে এর ফলে যে সম্ভাব্য অস্পষ্টতা দেখা দেয় না ::কেন?

প্রদত্ত যে সি ++ এমন একটি পরিবর্তনশীল নাম যা একটি প্রকারের নামও মঞ্জুরি দেয় না, আমি এমন কোনও ক্ষেত্রে ভাবতে পারি না যেখানে এটি ঘটতে পারে।

স্পেসিফিকেশন: আমি কেন জিজ্ঞাসা করছি না কেন ::তাকে বেছে নেওয়া হয়েছিল ., যদি এটি খুব কাজ করতে পারে?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
— স্যামুয়েল লিউ

উত্তর:


124

বিদ্যমান সি কোড (যা বস্তুর নাম এবং স্ট্রাক্ট ট্যাগের মধ্যে নামের সংঘর্ষের অনুমতি দেয়) এর সাথে সি ++ সর্বাধিক সামঞ্জস্যপূর্ণ করার চেষ্টার কারণে, সি ++ শ্রেণীর নাম এবং অবজেক্টের নামের মধ্যে সংঘর্ষের অনুমতি দেয়।

যা এর মানে হল যে:

struct data {
    static int member;
};

struct data2 {
    int member;
};

void f(data2& data) {
    data.member = data::member;
}

বৈধ কোড।


11
সুতরাং শিরোনামে প্রশ্নের উত্তর হ্যাঁ, এটি হবে , তাই না?
— এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

2
এই টুইটটি সহজ নয় জাভা বা সি # এর মতো সি ++ সম্পূর্ণ নতুন ভাষা হিসাবে বিকশিত হয়েছিল, অস্পষ্টতা সম্ভবত এড়ানো যায় । তবে সি ++ "ক্লাস সহ সি" হিসাবে বিকশিত হয়েছিল এবং সে কারণেই এটি হয় না। "হ্যাঁ, এটি হবে " একটি সঠিক উত্তর, তবে একটি ভিন্ন প্রশ্নের।
— কিট

অপেক্ষা করুন, নিয়োগ লাইন মাত্র দেখানো হয় না যে নির্বাণ .বা ::একই দুই "শব্দ" এর মাঝে বিভিন্ন প্রভাব রয়েছে ( data.memberবোঝায় memberএর dataবর্গ বস্তুর data2, যেহেতু data::memberবোঝায় memberক্লাসের data)?
— এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

1
হ্যাঁ, তবে ভাষা ডিজাইনারদের জন্য এটি গর্ব করা উচিত এমন কিছু নয়। এটি সামঞ্জস্যের সিদ্ধান্তের একটি নিদর্শন মাত্র।
— কিট

ঠিক আছে, আমি বুঝতে পেরেছি যে সি ++ বর্তমানে কীভাবে রয়েছে এবং এখনও অবধি (এটিও) নির্ভর করে যে তখন সি ++ এর থেকে বিকাশকালে সি কী ছিল। তবে সি ++ এর মতো কথা বলা এবং এটি কেন যেমন রয়েছে সেদিকে রেখে, যদি সমস্তগুলিতে ::পরিবর্তিত হয় তবে একটি অস্পষ্টতা তৈরি হবে .। একটি উপায়ে আপনি ইতিমধ্যে হ্যাঁ উত্তর দিয়েছেন । আমি কেবল আপনার প্রথম মন্তব্যটি লঙ্ঘন করতে পারি না। হতে পারে আমার স্তর মন্তব্যটিকে আমার কাছে ধোঁয়াটে দেখাচ্ছে।
— এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

37

উভয় বৈধ হলেও একটি উদাহরণ যেখানে বিভিন্ন অবজেক্টগুলি উল্লেখ করুন:

#include <iostream>

struct A {
    int i;
};

struct B {
    int i;
    A B;
};

int main() {
    B x {0, 1};
    std::cout << x.B.i << '\n';
    std::cout << x.B::i << '\n';
}

কলিরুতে লাইভ দেখুন ।


আর এই এক করতে পারেনি সহজে বিভিন্ন নকশা সিদ্ধান্তের সঙ্গে সমাধান করা!
— ব্যবহারকারী 253751

7

নেমস্পেস হিসাবে ব্যবহৃত যা বোঝায় তার মধ্যে a::bএবং a.bযেখানে পার্থক্য রয়েছে তার অর্থ এটি নামস্থান বা টাইপনেম। প্রদত্ত যে সি ++ অ-ভার্চুয়াল বহুবর্ণ উত্তরাধিকারকে সমর্থন করে এবং একটি ভেরিয়েবলের একটির মতো একই নাম থাকতে পারে, এই ভুল অবজেক্টের রেফারেন্সের সম্ভাবনা থাকে। এটি টেমপ্লেট ধাতব প্রোগ্রামের জন্য প্রয়োজনীয়।::a

বি ক্লাস বি এর পরিপ্রেক্ষিতে আরেকটি উদাহরণ &B::fooবনাম হবে vs&B.foo


2

@ ডেডুপ্লিকেটর উদাহরণটি প্রসারিত করুন:

#include <iostream>

struct A {
    int i;
};

struct B : public A {
    int i;
    A A;
};

int main() {
    B x {1, 2};
    std::cout << x.i << '\n';
    std::cout << x.B::i << '\n';  // The same as the line above.
    std::cout << x.A.i << '\n';
    std::cout << x.A::i << '\n';  // Not the same as the line above.
}

কলিরু দর্শনে লাইভ

:: এর সাহায্যে পার্থক্য করার সম্ভাবনা না থাকায়, আমরা কোন সদস্যটি অ্যাক্সেস করতে চাই, প্যারেন্ট ক্লাসে ঘোষিত সদস্যদের অভিন্ন নাম সহ অ্যাক্সেস করা অসম্ভব।


A A(পরিবর্তনশীল নাম যা একটি প্রকারের নামও) যদিও সি ++ তে বৈধ নয়, সুতরাং এই উদাহরণটি আপাতত কার্যকর হয় না
— জিমি আরটি

1
@ JimmyR.T। কলিরু দর্শনে কাজের জীবনের উদাহরণ রয়েছে। আপনার বিবৃতিটি মানক অনুচ্ছেদের সাথে নিশ্চিত করুন with
— এসএম

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