Ссылки на функции с динамическими массивами и структурами C ++ - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с пониманием теории между тем, что происходит с моими двумя функциями в C ++.К сожалению, я не смог скопировать весь код, потому что мне пришлось бы перевести все это с моего родного языка на английский.Дилемма, с которой я столкнулся, заключается в следующем: - и allStudents, и oldAnswers являются динамическими массивами - функция dataEntry прекрасно работает в том виде, в каком она есть, она изменяет allStudents, и изменение эффективно в основной функции, хотя аргументы были dataEntry (Student * allStudents ...), а не dataEntry (Student * & allStudents ...) - чтобы получить функцию addNewAnswer для эффективного изменения указателя oldAnswers в основной функции, я должен определить аргументы с помощью &, поэтому addNewAnswer (AllAnswers* & oldAnswers ...)

Почему один работает без &, а другой нет, хотя оба эффективно вносят изменения в указатели?Это потому, что функция addNewAnswer также вносит изменения в размер массивов (выделение памяти)?

 int questionsCounter = 5;
    enum Answers { CORRECT, INCORRECT };

    struct Student {
        int _stNumber;
        char _name[30];
        int _year;
        Answers *_answers;
        char * _userName;
        char *_password;
    };

    struct AllAnswers {
        int AnswerNumber;
        char *Question;
        Answers correctAnswer;
    };

    void dataEntry(Student * allStudents, int max) {

    for (int i = 0; i<max; i++) {
        cout << "\t::STUDENT " << i + 1 << "::";
        cout << "Enter Student's name: ";
        cin.getline(allStudents[i]._name, 30);
        cout << "Enter Student's number: ";
        cin >> allStudents[i]._stNumber;
        cout << "Enter Student's year (1,2,3,4): ";
        cin >> allStudents[i]._year;


        allStudents[i]._userName = new char[11];
        allStudents[i]._userName = GetUserName(allStudents[i]);

        allStudents[i]._password = nullptr;
        changePassword(allStudents[i]);     
    }
}

void addNewAnswer (AllAnswers *& oldAnswers, AllAnswers newAnswer) {

    AllAnswers *temp = new AllAnswers[questionsCounter+1];


    for (int i = 0; i < questionsCounter; i++)
    {   
        copyAnswer(oldAnswers[i], temp[i]);
    }

    copyAnswer(newAnswer, temp[questionsCounter]);

    deallocateAnswers(oldAnswers);

    assert(oldAnswers != NULL);

    oldAnswers = new AllAnswers[questionsCounter+1];


    for (int i = 0; i < questionsCounter+1; i++)
    {
        copyAnswer(temp[i], oldAnswers[i]); 

    }

    questionsCounter++; 
}

1 Ответ

0 голосов
/ 19 мая 2018

oldAnswers = редактирует сам указатель, как вы сказали.

operator[] на самом деле функция, которая берет указатель и возвращает ссылку.Когда у вас есть allStudents[i] =, вы фактически не редактируете сам указатель.Вместо этого вы путешествуете i Students за указателем allStudents и редактируете все, что там есть.

Так что не имеет значения, является ли allStudents копией (передача по ссылке) или псевдонимом (передача по значению) другого указателя, потому что в любом случае все students[i] возвращает одну и ту же ссылку нато же самое Student.

Когда вы не выполняете курсовую работу, используйте std::vector вместо new[].Это намного более интуитивно понятно в отношении семантики значения / ссылки, чем указатель в кучу, что очень удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...