J'ai 3 classes. Dans sa forme la plus simple, il ressemble,Travailler avec des fonctions constantes et non constantes - C++
class tree
{
public:
tree_node* find_node(const std::string& text) {
return factory.find(text);
}
private:
tree_node_factory factory;
}
class tree_node
{
public:
tree_node(const std::string& text) : text_(text) {}
const std::string& text() const {
return text_;
}
void set_parent(const tree_node* new_parent);
private:
std::string text_;
}
class tree_node_factory
{
public:
tree_node* find(const std::string& text);
private:
std::vector<tree_node*> allocated_nodes;
}
Je ne veux pas permettre aux utilisateurs de tree
de modifier les tree_node
renvoyées par les méthodes comme find_node
. Alors je l'ai changé, find_node
et tree_node_factory::find
à,
const tree_node* find_node(const std::string& text) const {
return factory.find(text);
}
const tree_node* find(const std::string& text) const;
Le problème est tree
interne devrait être en mesure de modifier les nœuds et travailler sur des méthodes comme set_parent
. Mais depuis l'usine ne retourne que const
nœuds, j'ai fini avec ajouter une autre surcharge (version non const) de find
dans l'usine. Je me demande si c'est la bonne façon de gérer ce genre de problèmes? Je vois que le code est dupliqué dans les versions const et non-const.
Toutes les pensées ..?
Ceci est normal; Regardez la plupart des classes STL et vous verrez qu'elles fournissent à la fois des versions const et non-const. Je pense que c'est Sutter qui parle d'une façon d'utiliser (bien formé) 'const_cast' et' static_cast' ensemble pour supprimer la duplication de code (en appelant l'autre version); Je soupçonne quelqu'un de l'afficher. Mais oui, c'est normal. – GManNickG
C'est cool. Merci GMan. –
en double - http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between-similar-const-and-non-const-member-funct – Manuel