2016-02-15 6 views
5

मैं अपने सी ++ सिमुलेशन सॉफ़्टवेयर को लाइब्रेरी में कुछ कोड विभाजित करने की कोशिश कर रहा हूं, इसलिए इसका उपयोग अधिक लचीला रूप से किया जा सकता है। सिमुलेशन Lattice पर आधारित है, जिसमें Node एस शामिल हैं जो पॉइंटर्स की सूचियों को उनके Neighbor एस में रखते हैं। । पड़ोसियों भी नोड कर रहे हैं, मैं अतिरिक्त तर्क/क्षेत्रों को लागू करने के क्रम में *Node सूचक के चारों ओर एक छोटे से आवरण वर्ग करना चाहते हैं (जैसे, bool is_neares_neighbor या तोकौन सी सी ++ पैटर्न लाइब्रेरी के लिए उपयोग करने के लिए है जो इसकी कक्षाओं को विस्तारित करने की अनुमति देता है?

मेरी कक्षा वास्तुकला इसलिए कुछ इस तरह दिखता है:

class Lattice { 
private: 
    vector<Node> _nodes; 
}; 

class Node { 
private: 
    vector<Neighbor> _neighbors; 
}; 

class Neighbor { 
private: 
    Node * _node; 
}; 

अब तक तो अच्छा। अब, मैं सब जाली संबंधी तर्क को संभालने के लिए मेरे पुस्तकालय है, लेकिन कुछ भी नहीं करना चाहते हैं। हालांकि, जब कुछ परियोजना में लाइब्रेरी का उपयोग कर, तीन वर्गों (Lattice, Node, Neighbor) में अधिक तर्क और क्षेत्र होंगे। इसलिए उपयोगकर्ता को इन कक्षाओं से उत्तराधिकारी और अपने रिवाज को लागू करने में सक्षम होना चाहिए सामान, जबकि लाइब्रेरी अभी भी सभी जरूरी जाली से संबंधित तर्क को संभालती है।

ऐसा करने का अनुशंसित तरीका क्या है? क्या यहां टेम्पलेट उपयुक्त हैं? एक टेम्प्लेटेड स्थिति में, मेरी क्लास पदानुक्रम इस प्रकार दिखाई देगा:

template<class N> 
class Lattice { 
private: 
    vector<N> _nodes; 
}; 

template<class NN> 
class Node { 
private: 
    vector<NN> _neighbors; 
}; 

template<class N> 
class Neighbor { 
private: 
    N * _node; 
}; 

आप देख सकते हैं, एक-दूसरे के प्रकार है, जो एक परिपत्र हालत मैं पता नहीं है कैसे निपटने के लिए है पता करने के लिए दोनों Node और Neighbor जरूरत यहां साथ। इसके अलावा, पूरी लाइब्रेरी को हेडर फाइलों में रहना होगा।

सी ++ दुनिया में इन तरह की स्थितियों को सबसे सुंदर तरीके से कैसे पेश किया जाता है?

+0

एन और एनएन क्या हैं? मुझे लगता है कि मेरे पास पूछे जाने वाले प्रश्न का समाधान है, हालांकि मुझे पड़ोसी के अंदर नोड के लिए कच्चे सूचक के बारे में कुछ चिंताएं हैं। –

+0

क्या नोड और पड़ोसी के प्रकार वास्तव में एक दूसरे से पूरी तरह से स्वतंत्र हैं? क्या एक विशिष्ट प्रकार का नोड एक विशिष्ट प्रकार का पड़ोसी नहीं है? मैं नोड और पड़ोसी को अमूर्त कक्षाओं (इंटरफेस) के रूप में कल्पना करता हूं और उनसे कंक्रीट नोड्स और पड़ोसियों को प्राप्त करता हूं। लेकिन शायद मुझे आपकी आवश्यकता गलत हो गई। –

+0

अरे, उत्तर देने के लिए दोनों धन्यवाद। @ केनीओस्ट्रॉम: एन और एनएन क्रमशः 'नोड' और 'पड़ोसी' से प्राप्त कक्षाएं हैं, जो उपयोगकर्ता द्वारा प्रदान की जाती हैं। तो उपयोगकर्ता 'नोड' और' पड़ोसी 'वर्ग दोनों में फ़ंक्शन और चर जोड़ सकता है। @ फ्रैंकफफर: वे निर्भर नहीं हैं। दो 'नोड', काउंटरों और अन्य के बीच संबंधों में बहुत सी मेटा जानकारी मौजूद हो सकती है। यह 1: एन रिश्ते की तरह है जहां संबंधों के बारे में अतिरिक्त जानकारी संग्रहीत की जा सकती है। हालांकि, यदि संभवतः कोई अन्य समाधान नहीं है, तो शायद यह वह हिस्सा है जिसे मैं आसानी से छोड़ सकता हूं। मैं बस इसे बहुत लचीला बनाना चाहता हूं। – janoliver

उत्तर

1

मुझे लगता है कि आप टेम्पलेट प्रकार को "कुछ अन्य प्रकार" होना चाहते हैं जो आपकी जाली लाइब्रेरी को नहीं जानता या उसकी परवाह नहीं है। तो उपयोगकर्ता को नोड से प्राप्त करने की बजाय, आप अपने सभी वर्गों के लिए टेम्पलेट < कक्षा t_data > का उपयोग करें।

आप अपने आप को कहा, पड़ोसी, एक नोड है, इसलिए आप नोड <t_data> के मामले में सब कुछ परिभाषित करने के लिए सक्षम होना चाहिए।

आपको यह भी विचार करना चाहिए कि आप जाली बनाने के लिए कैसे जा रहे हैं, और आप इसके बारे में जानकारी कैसे वापस लाएंगे। यहां एक उदाहरण दिया गया है जहां मुझे लगता है कि जाली वर्ग नोड्स बनाकर जाली बनाते हैं, जिससे उन्हें सृजन के समय मौजूदा नोड्स से कनेक्ट करने का विकल्प मिलता है।

#include <vector> 
#include <memory> 

template<class t_data> 
class SetOfNodes; 

template<class t_data> 
class Node { 
public: 
    Node(t_data value, SetOfNodes neighbors) : _data(value), _neighbors(neighbors) {} 
    is_nearest_neighbor(const Node &other){ 
     // is other in _neighbors? 
     // is other the closest neighbor? 
     return false; 
    } 
private: 
    t_data _data; 
    SetOfNodes _neighbors; 
}; 

template<class t_data> 
class SetOfNodes { 
public: 
    std::vector<std::shared_ptr<Node<t_data>>> _nodes; 
}; 

template<class t_data> 
class Lattice { 
public: 
    SetOfNodes get_all_nodes(); 
    void create_new_node(SetOfNodes neighbors); 
private: 
    SetOfNodes _nodes; 
}; 

मैं वास्तव में पड़ोसी को समझने नहीं है, क्योंकि या तो यह एक नोड है, या यह दो नोड्स शामिल है, इसलिए मुझे लगता है कि एक अकेला छोड़ देंगे।

+0

तकनीकी रूप से आपके नोड्स में कोई भी प्रकार नहीं है, लेकिन मुझे लगता है कि इस पुस्तकालय का बिंदु किसी अन्य प्रकार के साथ काम करना था, और यही कारण है कि आपने टेम्पलेट –

+0

हाय केनी का उल्लेख किया है, आपके सुझाव के लिए धन्यवाद। आपका सुझाव किसी प्रकार की अतिरिक्त डेटा संरचना का उपयोग करना प्रतीत होता है, जो कि मेरे पुस्तकालय के वर्गों में सदस्य के रूप में जोड़ा जाता है, जबकि लाइब्रेरी स्वयं अपने प्रकार के साथ काम करती है। मैं बाद में कोशिश करूँगा। यह थोड़ा सा सुरुचिपूर्ण है, मैंने सोचा कि मैं इसे हल कर सकता हूं, जिसमें उपयोगकर्ता को ऐसी कक्षा निर्दिष्ट करने के लिए मजबूर होना पड़ता है और इसके बिना लाइब्रेरी का उपयोग नहीं कर सकता है, लेकिन शायद यह करेगा। – janoliver

+0

कोई भी जवाब वास्तव में मेरी आवश्यकताओं को बहुत अच्छी तरह से फिट नहीं करता है, इसलिए मैंने जाली सामान की एक स्वतंत्र पुस्तकालय नहीं बनाने का फैसला किया है। यह जवाब सबसे अच्छा विकल्प होगा, हालांकि, मैं इसे सही के रूप में चिह्नित करूंगा। – janoliver

0

मैं कम्पोजिट/आगंतुक पैटर्न के संयोजन का उपयोग करने के लिए आप की सिफारिश करेंगे:

  • कम्पोजिट आप जाली/नोड/पड़ोसी/Custom_User_Node_Derived वर्ग है जो समान रूप से इलाज किया जा सकता का एक पदानुक्रम परिभाषित करने (जो भी सामग्री है में मदद मिलेगी)
  • विज़िटर आपको पदानुक्रम को क्रॉल करने और आपके जाली/नोड/पड़ोसी वर्ग के लिए तर्क को समाहित करने में मदद करेगा और उपयोगकर्ता को नए परिचालन को परिभाषित करने में मदद करेगा, जिसे आप वास्तव में अभी तक अनुमानित नहीं कर सकते हैं।

यह एक विशेष रूप से अनुशंसित दृष्टिकोण है जब आप लाइब्रेरी (या कक्षाओं का सेट) का विस्तार करना चाहते हैं जिस पर आपके पास नियंत्रण नहीं है। मेरी समझ से यह एक चीज है जिसे आप चाहते हैं कि आपका उपयोगकर्ता सक्षम हो।

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

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