Атрибуты C ++ Struct могут изменяться внутри функции, но оставаться неизменными вне области функции - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над навязанным самим вызовом, который включает в себя реализацию связанного списка и функции добавления для него, что вызывает у меня проблемы, кажущиеся связанные с областью действия переменной.

Функция добавления проходит по каждому элементу ссылки пока он не прочитает значение NULL, а затем изменит значение данных, связанное с этой ссылкой, на вход функции. Тестовые выходы в функции, кажется, показывают, что она работает как задумано, но при выполнении того же теста вне функции, даже после того, как она вызвана, выдает другой выход.

template <class T>
struct atom{
    T data;
    atom<T>* link = NULL;
};

template <class T>
void append_LL(atom<T> first, T input_data){

    atom<T>* current_node = &first;

    atom<T>* next_node = current_node->link;

    int i = 0;
    while (i < 4 && next_node != NULL) {
        current_node = next_node;
        next_node = next_node->link;
        i ++;
    }
    current_node->data = input_data;
    current_node->link = (atom<T>*)malloc(sizeof(atom<T>));
    cout << "leaving node as: " << current_node->data << endl; //outputs 5
    cout << "input nodes data: " << first.data << endl;        //outputs 5
}
int main() {

    int dd = 5;
    atom<int> linked_list;
    linked_list.data = 999;

    append_LL(linked_list, dd);

    cout << linked_list.data << endl; //outputs 999
}

1 Ответ

1 голос
/ 16 апреля 2020

Потому что вы не отправляете тот же atom. Вы видите, что программа делает копию linked_list в функции main и отправляет эту копию в функцию.

Если вы хотите изменить тот же linked_list, измените

void append_LL(atom<T> first, T input_data){

до

void append_LL(atom<T> &first, T input_data){

Таким образом, вы отправляете действительно atom, а не его копию.

...