【问题标题】:How do I cleanly pass a std::map between two objects?如何在两个对象之间干净地传递 std::map ?
【发布时间】:2013-05-30 15:07:30
【问题描述】:

我有一个工厂方法对象,它创建如下映射:

// std namespace is imported

Foo* createFoo() {
   map<int,int>* fooMap = new map<int,int>();
   for (int i=0;i < 4;i++) {
      fooMap->insert(make_pair(i+1, i+2));
   }
   return new Foo(fooMap);
}

foo类如下:

class Foo { 
    private: 
        map<int,int>* m_fooMap; 
    public: 
        Foo(map<int,int>* fooMap) : m_fooMap(fooMap) { }; 
        void doIt() {
            cout << m_fooMap->at(1) << endl;
        }
}

如果我调用 doIt 函数,这似乎会引发异常。当我调试时,我注意到地图对象似乎没有被创建和填充。如何在堆上正确创建地图?

PS:我不想创建映射并按值传递,我更愿意通过指针来作为学习练习。此外,如果我在堆栈上创建地图,它会被填充,但我当然不能将它传递给 Foo 对象,因为它超出了范围。

【问题讨论】:

  • 为什么都是动态分配?只需分配自动对象并按值返回。
  • 我想学习如何正确地做到这一点。我知道按值传递会起作用,但我想了解为什么这不起作用。
  • 正确地做就是避免所有这些动态分配。您正在学习正确地做到这一点。
  • @Salgar 虽然存在内存泄漏,所以并非完全没问题。
  • @dev_nut: Not necessarily.

标签: c++ stdmap


【解决方案1】:

我倾向于一种没有任何显式动态内存分配的方法:

class Foo { 
    private: 
        std::map<int,int> m_fooMap; 
    public: 
        Foo(const std::map<int,int>& fooMap) : m_fooMap(fooMap) {}; 
        Foo(std::map<int,int>&& fooMap) : m_fooMap(std::move(fooMap)) {}; 
        void doIt() {
            cout << m_fooMap.at(1) << endl;
        }
};

Foo createFoo() 
{
   std::map<int,int> fooMap;
   for (int i=0;i < 4;i++) {
      fooMap.insert(make_pair(i+1, i+2));
   }
   return Foo(fooMap);
}

【讨论】:

  • 除非这改变了签名,他说他想用指针动态地做。
  • @UpAndAdam 正确,但我认为 OP 的要求被误导了。
  • 我自己知道如何做到这一点,我只是要指出,您通过更改该约束来回避他问题的整个问题。无论如何,经典的四人组工厂方法总是需要返回一个指针。工厂方法的多态目的的一个重要部分是将知识以及如何从调用/使用类中创建复杂对象。如果他必须从一开始就知道要使用哪种具体类型,您就无法做到这一点。 stackoverflow.com/questions/1031301/…
猜你喜欢
  • 1970-01-01
  • 2017-04-05
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多