मेरे पास एक कॉन्स्ट-शुद्धता समस्या है जो मुझे हल करने में सक्षम नहीं लगती है।यह कॉन्स्टिगर कैसे किया गया है?
class Node
{
private:
int id;
std::set<Node*> neighbours;
public:
Node();
Node(int id_p);
void set_id(const int& id_p);
int get_id() const;
void add_neighbour(Node* neighbour);
bool is_neighbour(Node* neighbour) const;
friend bool operator <(const Node& lhs, const Node& rhs);
};
class Graph
{
private:
std::set<Node> node_list;
public:
Graph();
void add_node(int id);
const Node* get_node_by_id(int id) const;
bool has_node(int id) const;
void check_add_node(int id);
void add_edge(int id_1, int id_2);
bool has_edge(int id_1, int id_2) const;
void check_add_edge(int id_1, int id_2);
(...)
};
अब बात, अगर मैं समारोह Graph::get_node_by_id()
कहते हैं, मैं किसी दिए गए नोड (प्रकार Node
) के लिए सूचक वापस करना चाहते है: यहाँ मेरी कार्यक्रम की संरचना है। लेकिन ऐसा करना असंभव प्रतीत होता है, क्योंकि std::set
निहित रूप से मेरे नोड प्रकार की वस्तुओं को const Node
ऑब्जेक्ट्स में परिवर्तित करता है, और मैं const
ऑब्जेक्ट से non-const pointer
लाने में असमर्थ हूं।
हालांकि, मैं, क्योंकि मैं Graph::add_edge()
से Node::add_neighbour()
कॉल करना चाहते हैं const Node
के लिए सब कुछ किसी और सेट (जो समस्या का समाधान होता है) नहीं हो सकता है, लेकिन जब भी मैं ऐसा करते हैं, मेरी संकलक का कहना है कि मैं const
सत्ता (आवश्यक उल्लंघन कर रही है node_list
सेट में तत्वों का क्रमबद्ध सेट करने के लिए), भले ही मैंने को केवल id
पर ध्यान देने के लिए परिभाषित किया हो।
क्या इस दुविधा को हल करने के लिए मैं कुछ भी कर सकता हूं (सॉर्ट किए गए सेट को छोड़ दिए बिना)? आपके जवाबों के लिए शुक्रिया! त्रुटि पर
और जानकारी:
अगर मैं गैर लगातार खेतों, Graph::get_node_by_id()
में त्रुटि का उपयोग करें:
for(Node& element : this->node_list) // Error: element should be const Node&
{
if(element->get_id() == id)
{
return element;
}
}
return nullptr;
अगर मैं Graph::add_edge()
में लगातार खेतों, त्रुटि का उपयोग करें:
(...)
const Node* node_1 = this->get_node_by_id(id_1);
const Node* node_2 = this->get_node_by_id(id_2);
node_1->add_neighbour(node_2); // Error for disregarding constness
node_2->add_neighbour(node_1);
लगता है जैसे आप एक सेट के बजाय 'मानचित्र' मैपिंग आईडी नोड्स पर मैप करना चाहते हैं। –
user2357112
शायद मुझे कुछ याद आ रहा है, लेकिन आंतरिक सेट को म्यूटेबल के रूप में क्यों न रखें? –