从B类访问A类地图

时间:2016-04-27 10:31:57

标签: c++ class

我有两个类A类和B类.A类有一个map<int,int>类型的地图。

在A组中,我有以下定义,

   typedef std::map<int, int> mymap;

    mymap MYMAP;

    A A_OBJ;

    // did some insert operations on A_OBJ's MYMAP

我在A类中也有以下功能,当B调用时,会将A的MYMAP作为副本返回给B类。

A::mymap A::get_port(){

   // Returns A's map
   return this -> MYMAP;

}

在B班,

void B::initialize_table(){

     A::mymap port_table = A_OBJ.get_port();

     cout<< "size of ports table at A is"<<port_table.size());

}

代码编译时没有任何问题。唯一的问题是即使我向A的地图插入一些数据,B总是显示A的地图有0个元素。

我在B有一个定时器,每2秒调用initialize_table(),它应该从A获取最新的地图副本。不确定它出错的地方。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

您确定正在创建std::map的副本。解决这个问题的方法是初始化对地图的引用。

考虑以下存根:

#include <iostream>
#include <map>

using my_map = std::map<int, int>;

struct A {
  A() : m() {}
  my_map& get_my_map() { return m; }
  my_map m;
};

struct B {
  B() : a() {}  
  void initialize_map_ref();
  void initialize_map_val();
  void print_index_42() { std::cout << a.get_my_map()[42] << '\n'; }
  A a;
};

void B::initialize_map_ref() {
  // notice this is a reference
  my_map& m = a.get_my_map();
  m[42] = 43;
}

void B::initialize_map_val() {
  // notice this is a copy
  my_map m = a.get_my_map();
  m[42] = 43;
}

int main() {
    B b;
    b.initialize_map_ref();
    b.print_index_42();
    return 0;
}

B::initialize_map_ref初始化引用(即a内对地图的引用),其中B::initialize_map_val创建副本并初始化副本。通话结束后,副本将在通话之外消失m[42] == 0。另一方面,参考初始化仍然存在,因为您已经更改了对基础对象的引用。

Ideone:With referencewith value

答案 1 :(得分:0)

我建议为了效率而返回R值参考(即select * from xmltable('PivotSet/item' passing xmltype('<PivotSet> <item> <column name="INTERFACE_NO">1</column> <column name="INTERFACE_NAME_A">abc1</column> <column name="INTERFACE_L">11</column> <column name="INTERFACE_R">22</column> </item> <item> <column name="INTERFACE_NO">2</column> <column name="INTERFACE_NAME_A">abc2</column> <column name="INTERFACE_L">33</column> <column name="INTERFACE_R">44</column> </item> <item> <column name="INTERFACE_NO">3</column> <column name="INTERFACE_NAME_A">abc3</column> <column name="INTERFACE_L">55</column> <column name="INTERFACE_R">66</column> </item> <item> <column name="INTERFACE_NO">4</column> <column name="INTERFACE_NAME_A">abc4</column> <column name="INTERFACE_L">77</column> <column name="INTERFACE_R">882</column> </item> </PivotSet>') columns row_num FOR ORDINALITY ,aa varchar2(100) path './column[1]' ,bb varchar2(100) path './column[2]' ,cc varchar2(100) path './column[3]' ,dd varchar2(100) path './column[4]' ) )。

我只能在以下两种情况之一中看到您的代码失败:

  • 您致电A::mymap&& A::get_port(){return A::mymap(this -> MYMAP;) };后正在更新A_OBJ.MYMAP 这将导致副本过期。

  • 或者您正在更新A_OBJ.get_port()。然后再次呼叫A_OBJ.get_port()。这将导致副本被修改,但原始地图将保持不变,导致第二次调用A_OBJ.get_port()不考虑对前一个返回的值所做的任何更改。

根据您的需要,您可能希望返回对地图的(const)引用。

编辑我错误地认为A_OBJ.get_port()会导致两个副本,但现在我意识到它会导致副本然后移动,它也会在rvalue情况下执行此操作,然而,这可能会引入未定义的行为(我认为),因为返回对临时的引用...(原来我有A::mymap port_table = A_OBJ.get_port();但是会​​因为尝试绑定左值({{1 }})到右值参考)

相关问题