2012-06-11 12 views
12

मैंने जावा से सी ++ में एक वैज्ञानिक सिमुलेशन प्लेटफॉर्म को परिवर्तित कर दिया है। मैंने पिछले कार्यान्वयन के जितना संभव हो सके डिजाइन को रखने की कोशिश की है। देर से बाध्यकारी के कारण जावा में, परिपत्र निर्भरताओं को रन टाइम पर हल किया जाता है। हालांकि, परिपत्र निर्भरताओं ने सी ++ में एक गड़बड़ी का नरक बनाया है।सी ++, आपसी जरूरतों वाले दो वर्ग

  1. क्या कोई स्वचालित उपकरण है जिसमें सर्कुलर का विश्लेषण और संदर्भ शामिल है और संदर्भ? (विजुअल स्टूडियो 2010 केवल बकवास त्रुटियों की एक बड़ी सूची जारी करता है)।

  2. मैंने जहां भी संभव हो आगे संदर्भों का उपयोग करने की कोशिश की है। हालांकि कुछ अवसरों में दोनों वर्गों को अन्य वर्ग की कार्यक्षमता की आवश्यकता होती है (यानी उन तरीकों पर कॉल करें जो आगे संदर्भ का उपयोग करना असंभव बनाता है)। ये जरूरत तर्क में मौजूद हैं और यदि मैं मूल रूप से डिजाइन को बदलता हूं तो वे वास्तविक दुनिया के अंतःक्रियाओं का प्रतिनिधित्व नहीं करेंगे।

    हम दो वर्गों को कैसे कार्यान्वित कर सकते हैं जिन्हें एक-दूसरे के तरीकों और स्थिति की आवश्यकता होती है? क्या उन्हें सी ++ में लागू करना संभव है?

उदाहरण:

  • उदाहरण 1: मैं एक वर्ग "विश्व" कहा जाता है जो प्रकार "एजेंट" की वस्तुओं बनाता है। एजेंट को अपने पर्यावरण की जानकारी प्राप्त करने के लिए विश्व विधियों को कॉल करने की आवश्यकता है। दुनिया को एजेंटों के माध्यम से पुन: प्रयास करने और अपनी "रन" विधि निष्पादित करने और उनकी स्थिति प्राप्त करने की आवश्यकता है (समस्या के इस खंड को हल करने के लिए स्थिति अद्यतन संभवतः विपरीत किया जा सकता है लेकिन रन विधि नहीं)।
  • उदाहरण 2: एजेंट अपने "इरादों" का संग्रह बनाते हैं। प्रत्येक एजेंट को अपने इरादों के माध्यम से पुन: प्रयास करने और अद्यतन/अद्यतन/इरादे की स्थिति पढ़ने की आवश्यकता होती है। इरादों को एजेंट के माध्यम से पर्यावरण के बारे में जानकारी प्राप्त करने की भी आवश्यकता है (अगर सीधे "विश्व" के माध्यम से किया जाता है तो यह जटिल सर्कल बना देगा) और एजेंट की जानकारी भी।

आरेख नीचे वर्गों में से एक उप सेट दिखाता है, और अपने तरीके और गुण के कुछ:

sub-set of classes, and some of their methods and properties

+0

यदि आपको त्रुटियों में समस्याएं हैं, तो आप हमेशा उन त्रुटियों वाले प्रश्न पोस्ट कर सकते हैं (verbatim कृपया) और कोई भी इसके साथ आपकी सहायता करने में सक्षम होगा। साथ ही, ये त्रुटियां आपके लिए बकवास हो सकती हैं, लेकिन किसी और के लिए नहीं। कुछ कोड देखे बिना सवालों का जवाब देना भी बहुत मुश्किल है, और इसके लिए मैं आपको http://sscce.org/ पढ़ने की सलाह देता हूं। –

+0

जोआचिम, वे त्रुटियों के प्रकार हैं जो परिपत्र निर्भरता मामलों में उत्पन्न होते हैं। कक्षाओं की पहचान नहीं की जा सकती है। 'कोड' 1> ई: \ प्रोग्रामिंग \ cprojt \ actiondb11 \ actiondb \ base \ world.h (35): त्रुटि C2143: वाक्यविन्यास त्रुटि: '*' 1> ई: \ प्रोग्रामिंग \ cprojt \ actiondb11 \ actiondb \ base \ world.h (36): त्रुटि C2061: वाक्यविन्यास त्रुटि: पहचानकर्ता 'एजेंट' 1> ई: \ प्रोग्रामिंग \ cprojt \ actiondb11 \ actiondb \ base \ world.h (50): त्रुटि C2065: ' एजेंट ': अविकसित पहचानकर्ता – wmac

+1

त्रुटियां पोस्ट करने से कोड पोस्ट करना अधिक सहायक है। पोस्टिंग * दोनों * सबसे अच्छा है। –

उत्तर

17

मैं नहीं देख रहा हूं कि आगे की घोषणाएं आपके लिए कैसे काम नहीं कर रही हैं।

World.h:

#ifndef World_h 
#define World_h 

class Agent; 

class World 
{ 
    World(); 
    void AddAgent(Agent* agent) { agents.push_back(agent); } 
    void RunAgents(); 
private: 
    std::vector<Agent*> agents; 
}; 

#endif 

Agent.h:

#ifndef Agent_h 
#define Agent_h 

class World; 
class Intention; 

class Agent 
{ 
    Agent(World& world_): world(world_) { world.AddAgent(this); } 
    status_t Run(); 
private: 
    World& world; 
    std::vector<Intention*> intentions; 
}; 

#endif 

World.cc:

#include "World.h" 
#include "Agent.h" 

void World::RunAgents() 
{ 
    for(std::vector<Agent*>::iterator i = agents.begin(); i != agents.end; ++i) 
    { 
     Agent& agent(**i); 
     status_t stat = agent.Run(); 
     // do something with stat. 
    } 
} 

// ... 

एजेंट ऐसा लगता है कि आप की तरह कुछ की जरूरत है लग रहा है।सीसी:

#include "Agent.h" 
#include "World.h" 
#include "Intention.h" 

// ... 
+1

मैं सीपीपी फ़ाइलों के शीर्ष पर फ़ाइलों को शामिल करने के साथ फिर से संदर्भों का प्रयास करूंगा। मुझे लगता है कि उम्मीदों को हल करने की उम्मीद है। – wmac

+3

भले ही भाषा द्वारा इसकी आवश्यकता नहीं है, फिर भी फ़ाइल की शुरुआत में सभी शामिल करना अच्छा अभ्यास है, इसलिए कोई भी व्यक्ति आपके कोड को पढ़ने से इसकी निर्भरताओं को तुरंत जान सकता है। –

+1

क्या कोई समाधान नहीं है यदि आपके पास न केवल संदर्भ हैं लेकिन टाइप बी में टाइप ए के वास्तविक उदाहरण हैं और इसके विपरीत? मुझे कंपाइलर से एक "अपूर्ण प्रकार" त्रुटि मिलती है, जो समझ में आता है। लेकिन क्या इसके आसपास कोई रास्ता है? –

3

आप केवल आगे घोषणाओं के साथ समस्या को हल कर सकते हैं, लेकिन आप शायद 'नहीं था वर्ग की घोषणा से कार्यान्वयन को अलग नहीं करते हैं।

यदि आपको कक्षा से विधियों को कॉल करने की आवश्यकता है, तो एक पूर्ण प्रकार की आवश्यकता है, यही कारण है कि आपको फ़ाइल को शामिल करने की आवश्यकता है। सर्कुलर निर्भरताओं के बारे में चिंता किए बिना आप फ़ाइल को cpp (कार्यान्वयन फ़ाइल) में शामिल कर सकते हैं।

+0

धन्यवाद लुचियन। मेरा कार्यान्वयन अलग है लेकिन मैंने आगे संदर्भों के साथ सीपीपी फाइलों में शामिल नहीं किया है। – wmac

संबंधित मुद्दे