【问题标题】:return a pointer to a member of an object that is created on the heap返回指向在堆上创建的对象成员的指针
【发布时间】:2016-01-14 05:44:37
【问题描述】:

如果我有课

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?
}

【问题讨论】:

  • 使用 Map 存储 key 和 value。
  • 我实际上是在尝试实现一个哈希映射,所以我不能使用现有的库。

标签: c++ pointers object rvalue


【解决方案1】:

尝试将这行代码添加到您的代码中。

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.htmlJohannes Schaub - litb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多