Mam problem z poprawnością const, którego nie potrafię rozwiązać. Oto struktura mojego programu:Jak to naprawić?
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);
(...)
};
Teraz rzeczą jest, jeśli wywołanie funkcji Graph::get_node_by_id()
chcę zwracają wskaźnik do danego węzła (typ Node
). Ale wydaje się to niemożliwe, ponieważ std::set
niejawnie konwertuje obiekty typu węzła na obiekty const Node
i nie mogę pobrać obiektu non-const pointer
z obiektu const
.
Jednakże, nie można mieć wszystkiego innego zestawu do const Node
(która rozwiąże ten problem), bo chcę zadzwonić Node::add_neighbour()
z Graph::add_edge()
, ale gdy robię tak, mój kompilator mówi, że może być naruszenie const
Ness (wymagane mieć posortowany zestaw) elementów w zestawie node_list
, mimo że zdefiniowałem less operator<
, aby dbać tylko o id
.
Czy jest coś, co mogę zrobić, aby rozwiązać ten dylemat (bez rezygnacji z sortowania)? Dziękuję za odpowiedzi!
Więcej informacji na temat błędu:
Jeśli używam non-stałych pól, błąd w 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;
Jeśli używam stałych pól, błąd w 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);
Wygląda na to, że możesz chcieć mieć identyfikatory mapowania "map" dla węzłów zamiast zestawu. –
user2357112
Może czegoś brakuje, ale dlaczego wewnętrzny zestaw nie może być zmienny? –