2016-02-28 9 views
0

У меня есть метод глубокой копии в пользовательском контейнере myCont. У меня есть экземпляр несортированного контейнера, который мне нужно сортировать и сбрасывать. Я создаю контейнер temp с отсортированным флагом, вызовите метод копирования и Dump. Но приведенный ниже код приложения создает пустой контейнер и передает его, а не мой (загруженный) контейнер. Нужна помощь в выяснении того, что здесь происходит. Заранее спасибоC++: Почему здесь вызван конструктор

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

App Код:

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); И, если вы хотите, чтобы компилятор помог, поставьте «явный» перед тем, что разрешает вам конвертировать из bool в myCont. Я предполагаю, что у вас есть конструктор «myCont (bool x)», который может быть «явным myCont (bool x)». (Просто догадаться ...) –

+0

Вот и все! Большое спасибо. Да, есть конструктор с myCont (bool). – 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.

Смежные вопросы