C ++: Как сделать связанный список со структурой, передаваемой в качестве параметра? - PullRequest
0 голосов
/ 22 сентября 2018

Так что я понимаю (в основном) концепцию связанных списков с указателями.Однако я не уверен, как мне удастся создать связанный список объекта struct, который передается в методе.Нужен ли мне другой указатель для указания на указатели на структуру?Моя структура содержит указатель:

// define a structure to hold bid information
struct Bid {
    string bidId; // unique identifier
    string title;
    string fund;
    double amount;
    Bid *next;
    Bid() {
        amount = 0.0;
        next = NULL;
    }
};

И я передаю объект структуры этому методу для добавления новых структур ставок:

  void LinkedList::Append(Bid bid) {
    // FIXME (3): Implement append logic

    //reference bid being passed??? Bid struct has pointers, do we need another pointer?
    Bid *currNode = &bid;

    //set node's next pointer to NULL (end)
    currNode->next = NULL;

    //if list is empty
    if (head == NULL) {
        head = currNode;
        tail = currNode;
    }
    else {
        tail->next = currNode;
        tail = currNode;
    }
}

1 Ответ

0 голосов
/ 22 сентября 2018

Проблема передачи узлов связанного списка по значению заключается в том, что они копируются.Вы можете установить указатель так, чтобы он указывал на значение bid в вашей функции, но это почти наверняка не то, что вы хотите, потому что он исчезнет в конце функции, оставляя указатель свисающим.Узлы связанного списка практически всегда выделяются в куче и передаются по указателю, поскольку вы можете вручную управлять временем жизни объектов, выделенных в куче (что важно здесь).

Теперь, что делает это немного проблематичным източка зрения ОО состоит в том, что ваш класс Bid нарушает принцип единой ответственности (SRP), поскольку он одновременно является хранилищем конкретной информации о ставке и участника связывания определенных заявок вместе.Это одна из причин, по которой вы редко видите навязчивые контейнеры на ОО-языках.В зависимости от вашего конкретного случая использования, может быть предпочтительнее хранить Bid без указателя в BidNode, который будет выполнять связывание.Если бы вы сделали это, вы могли бы передать значение Bid по значению и скопировать его в выделенную кучу BidNode.Или, конечно, вы можете просто использовать std::list.

...