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


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.