2016-02-28 87 views
0

我在自定义容器中有深度复制方法myCont。我有一个我需要排序和转储的未排序容器的实例。我创建一个带有排序标志的临时容器,调用复制方法和转储。但下面的应用程序代码创建一个空的容器并传递它,而不是我的(加载的)容器。需要帮助弄清楚这里发生了什么。在此先感谢C++:为什么在这里调用构造函数

void myCont::Copy(const myCont& srcCont) 
{ 
    // code to deep copy from srcCont 
} 

应用代码:

fn(x, z, z) { 
    myCont dC(); 
    dC.setSorted(true); 
    dC.Copy(sC); 
    dC.DumpCont(); 
} 

大会:

myCont dC(); 
0000000140323068 mov   dl,1 
000000014032306A lea   rcx,[dC] 
0000000140323072 call  myCont::myCont (0141E1A01Ah) 
0000000140323077 nop 
     dSet.Copy(sC); 
0000000140323078 cmp   qword ptr [sC],0 
0000000140323081 je   CR::evaluate+6FDh (014032308Dh) 
0000000140323083 mov   byte ptr [rsp+0C2h],1 
000000014032308B jmp   CR::evaluate+705h (0140323095h) 
000000014032308D mov   byte ptr [rsp+0C2h],0 
0000000140323095 movzx  edx,byte ptr [rsp+0C2h] 
000000014032309D lea   rcx,[rsp+6F0h] 
00000001403230A5 call  myCont::myCont (0141E1A01Ah) <-WHY THIS CTROL CALL ???????????? 
00000001403230AA nop 
00000001403230AB lea   rdx,[rsp+6F0h] 
00000001403230B3 lea   rcx,[dC] 
00000001403230BB call  myCont::Copy (0141E1A188h) 
00000001403230C0 nop 
00000001403230C1 lea   rcx,[rsp+6F0h] 
00000001403230C9 call  myCont::~my Cont(0140009280h) 
     dC.DumpCont(); 
00000001403230CE lea   rcx,[dC] 
00000001403230D6 call  myCont::DumpCont(014019B240h) 

回答

2

这不是一个完整的例子,但因为你提供的程序集,我想我可以告诉是什么继续。

sC转换为bool(cmp为零,然后设置一个或零)。你必须在myCont类中有一个可以从一个bool转换而来的隐式构造函数。 sC显然不是类型myCont。 sC是否是myCont *?

+0

是的,sC是一个指向myCont实例的指针。 – user1409254

+0

然后你可能想要dC.Copy(* sC);而且,如果您希望编译器提供帮助,请将'explicit'放在任何允许您从bool转换为myCont的前面。我假设你有一个构造函数'myCont(bool x)',可以是'显式myCont(bool x)'。' (只是猜测...) –

+0

就是这样!非常感谢。是的,有一个myCont构造函数(布尔)。 – user1409254

1

从代码的点点你贴:

void myCont::Copy(const myCont& srcCont) 
{ 
    // code to deep copy from srcCont 
} 

这表明myCont::Copy()不返回新myCont对象,它不能修改srcCont对象。所以目前还不清楚Copy()函数实际上应该做什么。

另外,myCont dC();most vexing parse的一个实例 - 它是一个nop。

相关问题