परिपत्र निर्भरता?

ठीक है, मैं आगे की घोषणाओं को समझता हूं, लेकिन मुझे इस मामले में दोनों सिरों पर सदस्यों/फ़ील्ड को कॉल करने की आवश्यकता है, इसलिए मैं इसका उपयोग नहीं कर सकता। मैंने .cpp फ़ाइल के अंदर घोषणा को ओवरराइट करने का प्रयास किया (कक्षा के वास्तविक शीर्षलेख को शामिल करने के लिए मुझे उपयोग करने की आवश्यकता है) लेकिन जब मैंने इसका उपयोग करने की कोशिश की तो आगे की घोषणा के माध्यम से हेडर में परिभाषित सूचक तोड़ दिया गया था।

मैं इसके पास कैसे आ सकता हूं? क्या आपको कोड चाहिए?

0
खैर, मेरे पास एक इवेंट सिस्टम है। मेरे पास एक कक्षा ए भी है जिसमें क्लास बी के ऑब्जेक्ट का पॉइंटर होता है, और इस ऑब्जेक्ट को प्रबंधित करता है। अब मैं क्लास बी को घटनाओं को भेजने के लिए चाहता हूं, जिसमें क्लास ए के लिए एक पॉइंटर शामिल है। इस प्रकार सभी वर्गों को एक दूसरे को जानने की आवश्यकता है (इवेंट क्लास को छोड़कर, इसे केवल कक्षा ए को जानने की जरूरत है)
जोड़ा लेखक pixartist, स्रोत
घटनाएं या तो ए या बी कक्षा बी द्वारा संभाली नहीं जाती हैं, उन्हें "घटना" पता होना चाहिए। "घटना" को कक्षा ए को जानने की जरूरत है कक्षा ए को कक्षा बी को जानने की जरूरत है।
जोड़ा लेखक pixartist, स्रोत
क्योंकि कक्षा ए में एक फ़ील्ड होता है जिसके लिए ईवेंट की आवश्यकता होती है। (कक्षा ए में एक खिलाड़ी और अन्य जानकारी होती है, जिसका उपयोग लॉगिंग और पहचान के लिए किया जाता है, कक्षा ए एक गेम नियंत्रक है और कक्षा बी गेम तर्क है)
जोड़ा लेखक pixartist, स्रोत
एक एसएससीसीई सुंदर होगा ... sscce.org
जोड़ा लेखक Joe Z, स्रोत
आपके द्वारा वर्णित पारस्परिक निर्भरता एक डिजाइन दोष इंगित करता है। अपने डिजाइन की समीक्षा करें और दो प्रकार के बीच तंग युग्मन को खत्म करें।
जोड़ा लेखक Captain Obvlious, स्रोत
कक्षा बी को घटनाओं को भेजने के लिए कक्षा ए के प्रकार को जानने की आवश्यकता नहीं है। निर्भरता इंजेक्शन का प्रयोग करें। कक्षा ए को "EventReceiver" नामक कक्षा से प्राप्त करें, और उसके बाद क्लास बी में इवेंट रिसीवर को पॉइंटर स्टोर करें पर्यवेक्षक पैटर्न
जोड़ा लेखक Taylor Brandstetter, स्रोत
और घटना को कक्षा ए को जानने की आवश्यकता क्यों है?
जोड़ा लेखक Taylor Brandstetter, स्रोत

2 उत्तर

आपको यह ध्यान रखना होगा कि कक्षा में पॉइंटर बनाने के लिए केवल उस वर्ग के घोषणा की आवश्यकता होती है, जबकि उस वर्ग के सदस्यों तक पहुंचने के लिए इसकी परिभाषा की आवश्यकता होती है। तो परिपत्र निर्भरताओं को हल करने के लिए, तुम यह केर सकते हो:

A.hpp

class B;

class A
{
public:
  int foo(B *b);
  int bar();
};

B.hpp

class A;

class B
{
  A *m_a;
public:
  int foo();
  explicit B(A *a) : m_a(a) {}
};

A.cpp

#include "A.hpp"
#include "B.hpp"

int A::foo(B *b)
{
  return 2 * b->foo();
}

int A::bar()
{
  return 42;
}

B.cpp

#include "A.hpp"
#include "B.hpp"

int B::foo()
{
  return m_a->bar();
}
0
जोड़ा
मैंने कोशिश की लेकिन सूचक अमान्य था (स्मृति अपवाद)
जोड़ा लेखक pixartist, स्रोत
आह! तुम सही हो, मैंने एक चर का नाम गलत कर दिया!
जोड़ा लेखक pixartist, स्रोत

class base{};

class A: public base{
   base *bMember;
};

class B: public base{
   base *aMember;
};

0
जोड़ा
कुछ पुराने आईडीई आगे की घोषणाओं को अनदेखा करते हैं। मुझे इस तरह की समस्या थी जब मैं वीएस के कुछ संस्करण के साथ बहुत पहले एक परियोजना कर रहा था।
जोड़ा लेखक Paweł Stawarz, स्रोत
भले ही उसे वास्तव में ऐसा करने की ज़रूरत है, फिर भी घोषणाओं को पर्याप्त क्यों नहीं किया जाएगा? मुझे अमूर्त बेस क्लास का बिंदु नहीं दिख रहा है।
जोड़ा लेखक Taylor Brandstetter, स्रोत