2016-01-14 2 views
0

Так что, если у меня есть классвозвращает указатель на член объекта, который создается на куче

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

Если я создаю объект Item в куче:

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

ли это возможно ли получить указатель на элемент значения этого объекта?

К примеру, у меня есть еще один метод из другого класса

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

Используйте карту, чтобы сохранить ключ и значение. –

+0

Я на самом деле пытаюсь реализовать хэш-карту, поэтому я не могу использовать существующую библиотеку. – ZigZagZebra

ответ

0

Попробуйте добавить эти строки кода в код.

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>; 

См демо на http://coliru.stacked-crooked.com/a/3be5b80e848650c5

Кредит на http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html по Johannes Schaub - litb

Смежные вопросы