我有两个类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获取最新的地图副本。不确定它出错的地方。
感谢任何帮助。感谢。
答案 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 reference和with 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 }})到右值参考)