2013-06-14 4 views
1

J'ai eu un comportement étrange pendant que je donnais des paramètres. L'en-tête de ma méthode est:C++ étrange paramètre passant

class Acceptability { 
    public: 
    Graph* G;        
    std::unordered_set<node>* community;  
    std::unordered_set<node>* shell;   
    public: 
    Acceptability(Graph& G, std::unordered_set<node>& community, 
        std::unordered_set<node>& shell); 
    virtual ~Acceptability(); 
    virtual double getValue(node v) = 0; 
}; 
class NodeClusterSimilarity: public Acceptability { 
    public: 
    NodeClusterSimilarity(Graph& G, std::unordered_set<node>& community, 
          std::unordered_set<node>& shell); 
    virtual ~NodeClusterSimilarity(); 
    virtual double getValue(node v); 
}; 

Les constructeurs des deux classes sont les suivantes:

GreedyCommunityExpansion::Acceptability::Acceptability(
    Graph& G, std::unordered_set<node>& community, 
    std::unordered_set<node>& shell) { 
    this->G = &G; 
    this->community = &community; 
    this->shell = &shell; 
} 
GreedyCommunityExpansion::NodeClusterSimilarity::NodeClusterSimilarity(
    Graph& G, std::unordered_set<node>& community, 
    std::unordered_set<node>& shell) 
    : Acceptability(G, community, shell) { 
} 

En testant ma mise en œuvre, je crée un objet de type NodeClusterSimilarity avec community {0} et shell {1,2,3}. Ensuite, j'appelle la méthode getValue() et la surprise était: taille du community après avoir passé les paramètres est 1 (hurraaaaaaas !!!) mais la taille de la shell était 0: (([la valeur attendue est évidemment 3]

Quelqu'un peut-il me dire, qu'est-ce qui ne va pas?

+0

Veuillez publier l'implémentation de vos constructeurs. –

+1

Il serait utile de voir aussi le code de test qui appelle ces constructeurs. –

+3

Puisque vos constructeurs prennent des références et ne les copient pas, vous devez les appeler avec des variables qui persistent au moins aussi longtemps que vos objets. Est-ce le cas? –

Répondre

1

J'ai le sentiment que vous avez créé en place community {0} et shell {1,2,3} lors du test. c.-à-

NodeClusterSimilarity similarity(graph, {0}, {1,2,3}); 

Dans ce cas, vous prenez les adresses des valeurs temporaires, qui sont désallouées au moment où vous appelez getValue(). Vous avez deux options:

  • community et shell ont à vivre plus longtemps votre instance NodeClusterSimilarity. Fondamentalement les avoir en tant que variables séparées sur la pile avant d'appeler le constructeur.
  • Faire les membres soient const &, si vous n'êtes pas les modifier, et ils doivent se lier aux rvalues ​​et les maintenir en vie pendant toute la durée de Acceptability

pour la deuxième Concrètement le point:

class Acceptability { 
    public: 
    Graph const& G; 
    std::unordered_set<node> const& community; 
    std::unordered_set<node> const& shell; 
    public: 
    Acceptability(Graph const& G, std::unordered_set<node> const& community, 
        std::unordered_set<node> const& shell); 
    virtual ~Acceptability(); 
    virtual double getValue(node v) = 0; 
};