Ho un problema di const-correctness che non riesco a risolvere. Ecco la struttura del mio programma:Come avere questa correzione corretta?
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);
(...)
};
Ora la cosa è, se chiamo la funzione Graph::get_node_by_id()
, voglio restituire un puntatore ad un dato nodo (tipo Node
). Ma sembra impossibile, perché std::set
converte implicitamente gli oggetti di tipo Node in oggetti const Node
e non riesco a recuperare uno non-const pointer
da un oggetto const
.
Tuttavia, non posso avere tutto il resto insieme a const Node
(che sarebbe risolvere il problema), perché voglio chiamare Node::add_neighbour()
da Graph::add_edge()
, ma ogni volta che lo faccio, il mio compilatore dice che potrei essere violare la const
ness (richiesto per avere un insieme ordinato) degli elementi nel set node_list
, anche se ho definito lo less operator<
per preoccuparmi solo dello id
.
C'è qualcosa che posso fare per risolvere questo dilemma (senza rinunciare ad avere un set ordinato)? Grazie per le tue risposte!
Maggiori informazioni sull'errore:
Se uso i campi non costanti, di errore in 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;
Se uso i campi costanti, di errore in 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);
Sembra che si possa desiderare di avere un 'mappa 'ID di mapping ai nodi, piuttosto che un set. –
user2357112
Forse mi manca qualcosa, ma perché non mantenere il set interno come mutabile? –