2015-04-26 1 views
0

Почему функция ничего не меняет объект?Может ли функция ничего не делать, чтобы изменить объект?

У меня есть следующий код:

void sample(SList a) 
{ 
    cout << "\nIn Function"; 
    a.print(); 
} 

int main() 
{ 
    srand(500); 
    int total = 10; 
    SList llist; 

    for(int i = 0; i < total; i++) 
    { 
     llist.add_head(rand() % 100); 
    } 

    llist.print(); 
    llist.print(); 

    sample(llist); 
    llist.print(); 
    return 0; 
} 

Выход есть:

70 69 14 3 18 71 70 17 57 98 
70 69 14 3 18 71 70 17 57 98 
In Function 
70 69 14 3 18 71 70 17 57 98 
0 34365728 34365696 34365664 34365632 34365600 34365568 34365536 34365504 34365472 

Мой вопрос заключается в том, что функция sample, которая не имеет никакого отношения, связанные с SLIST, меняется SLIST. Как это делается? SList - это отдельный список.

Я думаю, что это как-то связано с передачей по значению. Было бы здорово, если кто-то покажет мне то, о чем я не знаю.

EDIT: Ответ на титульный вопрос будет да. Посмотрите на ответ.

ответ

2

Посмотрите на SList's копировать конструктор и деструктор. Мое предположение, не видя их, заключается в том, что конструктор копирования делает мелкую копию данных, а деструктор удаляет эти данные. Проблема заключается в том, что конструктор копирования вызывается при вызове sample, а затем вызывается деструктор, когда выходят sample. Есть несколько способов исправить это.

Вы можете передать SList по ссылке. Это предотвратит вызов конструктора копирования и деструктора.

Вы можете глубоко скопировать данные в конструктор копирования.

Другим решением является то, что SList сохраняет свои данные как shared_ptr, а не сырые данные.

+0

Да! Понял. Спасибо! –

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