Изучение C ++ из Java, попытка создать связанный список - PullRequest
2 голосов
/ 17 апреля 2010

Я только начал изучать C++ (исходя из Java) и у меня возникли серьезные проблемы с чем-либо: P В настоящее время я пытаюсь создать связанный список, но должен делать что-то глупое, потому что продолжаю получать " void значение не игнорируется, так как оно должно быть «ошибки компиляции (у меня оно помечено, где оно выбрасывает его ниже). Если бы кто-нибудь мог помочь мне с тем, что я делаю неправильно, я был бы очень благодарен :)

Кроме того, я не привык иметь выбор передачи по ссылке, адресу или значению и управления памятью в целом (в настоящее время у меня есть все мои узлы и данные, объявленные в куче). Если у меня есть общие советы, я бы тоже не пожаловался: P

Код ключа от LinkedListNode.cpp

LinkedListNode::LinkedListNode()
{
    //set next and prev to null
    pData=0; //data needs to be a pointer so we can set it to null for
             //for the tail and head.
    pNext=0;
    pPrev=0;
}

/*
 * Sets the 'next' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetNext(LinkedListNode& _next)
{
    pNext=&_next;
}

/*
 * Sets the 'prev' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetPrev(LinkedListNode& _prev)
{
    pPrev=&_prev;
}
//rest of class

Код ключа от LinkedList.cpp

#include "LinkedList.h"

LinkedList::LinkedList()
{
    // Set head and tail of linked list.
    pHead = new LinkedListNode();
    pTail = new LinkedListNode();

     /*
      * THIS IS WHERE THE ERRORS ARE.
      */
    *pHead->SetNext(*pTail);
    *pTail->SetPrev(*pHead);
}
//rest of class

Ответы [ 2 ]

6 голосов
/ 17 апреля 2010

Ведущий * в

*pHead->SetNext(*pTail);
*pTail->SetPrev(*pHead);

не нужны.

pHead - указатель на узел, и вы вызываете метод SetNext для него как pHead->SetNext(..), передавая object по ссылке.

-> имеет более высокий приоритет , чем *

Таким образом, вы пытаетесь разыменовать возвращаемое значение функции SetNext, которая ничего не возвращает, что приводит к этой ошибке.

3 голосов
/ 17 апреля 2010

Кроме того, я не привык выбирать передачу по ссылке, адресу или значению и управление памятью вообще (в настоящее время у меня есть все мои узлы и данные, объявленные в куче). Если у меня есть общие советы, я бы тоже не пожаловался: P

Бывшие Java-программисты всегда так делают. И это с ног на голову. Вы должны фактически никогда выделять кучу данных. Объекты должны быть объявлены в стеке, и если им нужна выделенная куча память, они должны обрабатывать это внутренне, выделяя ее в своих конструкторах и освобождая ее в своих деструкторах.

Это приводит к более чистому и безопасному коду.

Члены класса также должны быть значениями, а не указателями / ссылками, если только вам не нужен член, который должен быть общим для разных объектов. Если классу принадлежит только его член, просто сделайте его типом значения без указателя. Таким образом, он размещается внутри самого класса, и вам не нужно отслеживать новые / удалять вызовы.

Самое простое правило - не использовать указатели, если у вас нет . Вам нужен объект, который будет размещен в другом месте? Почему он не может быть выделен здесь и доступен по значению? Даже если объект должен быть возвращен из функции или передан в качестве параметра другой функции, копирование обычно позаботится об этом. Просто определите соответствующие конструкторы копирования и операторы присваивания и скопируйте объект при необходимости.

...