2016-01-14 2 views
0

Donc, si j'ai une classerenvoie un pointeur vers un membre d'un objet qui est créé sur le tas

class Item { 
public: 
    Item(int key, int value):key(key), value(value) {} 
    int GetValue() { 
    return value; 
    } 
private: 
    int key; 
    int value; 
} 

Si je crée un objet d'objet sur le tas:

Item *item = new Item(1, 2); 

Est-il possible d'obtenir le pointeur sur le membre de la valeur de cet objet?

Par exemple, j'ai une autre méthode d'une autre classe

int* GetValue(int k) { 
    Item* item = ...; // It finds the pointer to an Item object with key k that was created before. 
    // Is there anyway I can return the pointer to the value member of this item? 
// Something like: 
return &(item->GetValue()); // This won't compile because item->GetValue() is a r-value. Is there any alternative way to walk around? 
} 
+0

Utilisez la carte pour stocker la clé et la valeur. –

+0

Je suis en train d'essayer de mettre en œuvre une carte de hachage, donc je ne peux pas utiliser la bibliothèque existante. – ZigZagZebra

Répondre

0

Essayez d'ajouter ces lignes de code à votre code.

template <class Tag, typename Tag::type Value> 
struct Getter 
{ 
    friend typename Tag::type get(Tag) { 
     return Value; 
    } 
}; 

struct Tag_item { 
    typedef int Item::*type; 
    friend type get(Tag_item); 
}; 

int* GetValue(int k) { 
    static Item item(13, 14); 
    // std::cout << item.GetValue() << std::endl; // This line to test output. 
    return &(item.*get(Tag_item())); // If pItem is pointer then pItem->*get(Tag_item()) 
} 
template struct Getter<Tag_item, &Item::value>; 

Voir la démo à http://coliru.stacked-crooked.com/a/3be5b80e848650c5

Crédit http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html par Johannes Schaub - litb