এটি সম্পর্কে চিন্তা করার উপায় "সংকলকের মতো চিন্তা করা" "
কল্পনা করুন আপনি একটি সংকলক লিখছেন। এবং আপনি কোড এর মত দেখতে।
// file: A.h
class A {
B _b;
};
// file: B.h
class B {
A _a;
};
// file main.cc
#include "A.h"
#include "B.h"
int main(...) {
A a;
}
আপনি যখন সিসি ফাইলটি সংকলন করছেন (মনে রাখবেন যে .সিসি এবং না। এইচ সংকলনের একক), আপনাকে অবজেক্টের জন্য স্থান বরাদ্দ করতে হবে A
। তো, আচ্ছা, তাহলে আর কত জায়গা? যথেষ্ট পরিমাণে সঞ্চয় B
! B
তারপরে কী আকার ? যথেষ্ট পরিমাণে সঞ্চয় A
! উফ।
পরিষ্কারভাবে একটি বৃত্তাকার রেফারেন্স যা আপনাকে অবশ্যই ভেঙে ফেলতে হবে।
আপনি কম্পাইলারের পরিবর্তে যতটুকু স্পট জেনে রাখুন ততটুকু স্থান সংরক্ষণের অনুমতি দিয়ে এটি ভেঙে ফেলতে পারেন - পয়েন্টার এবং রেফারেন্স, উদাহরণস্বরূপ, সর্বদা 32 বা 64 বিট হবে (আর্কিটেকচারের উপর নির্ভর করে) এবং তাই যদি আপনি প্রতিস্থাপন করেন (উভয়টির দ্বারা) একটি পয়েন্টার বা রেফারেন্স, জিনিস দুর্দান্ত হবে। আসুন আমরা এটি প্রতিস্থাপন করুন A
:
// file: A.h
class A {
// both these are fine, so are various const versions of the same.
B& _b_ref;
B* _b_ptr;
};
এখন বিষয়গুলি আরও ভাল। কিছুটা। main()
এখনও বলে:
// file: main.cc
#include "A.h" // <-- Houston, we have a problem
#include
, সমস্ত এক্সটেন্টস এবং উদ্দেশ্যে (যদি আপনি প্রিপ্রোসেসরটি বাইরে নিয়ে যান) কেবল ফাইলটি .cc তে অনুলিপি করে । সত্যিই, .সিসি দেখতে দেখতে:
// file: partially_pre_processed_main.cc
class A {
B& _b_ref;
B* _b_ptr;
};
#include "B.h"
int main (...) {
A a;
}
সংকলক কেন এটি মোকাবেলা করতে পারে না তা আপনি দেখতে পারেন - এটি কী তা কোন ধারণা নেই B
- এটি প্রতীকটি আগে কখনও দেখেনি।
সুতরাং আসুন সম্পর্কে সংকলক বলতে B
। এটি একটি অগ্রণী ঘোষণা হিসাবে পরিচিত , এবং এই উত্তরে আরও আলোচনা করা হয়েছে ।
// main.cc
class B;
#include "A.h"
#include "B.h"
int main (...) {
A a;
}
এটি কাজ করে । এটা দুর্দান্ত না । তবে এই মুহুর্তে আপনার বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স সমস্যাটি বোঝা উচিত এবং এটি ঠিক করার জন্য আমরা কী "ফিক্স" করতে পেরেছিলাম।
এই সংশোধনটি খারাপ হওয়ার কারণ হ'ল পরবর্তী ব্যক্তিকে এটি ব্যবহারের আগে তাদের #include "A.h"
ঘোষণা B
করতে হবে এবং ভয়াবহ #include
ত্রুটি পাবে। সুতরাং আসুন মধ্যে ঘোষণা সরানো যাক আহ নিজেই।
// file: A.h
class B;
class A {
B* _b; // or any of the other variants.
};
এবং ভিএ , এই মুহুর্তে, আপনি #include "A.h"
সরাসরি সরাসরি করতে পারেন ।
// file: B.h
#include "A.h"
class B {
// note that this is cool because the compiler knows by this time
// how much space A will need.
A _a;
}
আছে HTH।