2012-05-26 1 views
3

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

//===== Struct ===== 

struct Node 
{ 
    Node *next; 
    Node *prev; 
    std::string val; 
    Node(const std::string &value, Node *nextVal = NULL, Node *prevVal = NULL) : 
     val(value), next(nextVal), prev(prevVal) {} 
}; 

//===== Class ==== 
class Node 
{ 
public: 
    Node(std::string value = "", Node *pVal = NULL, Node *nVal = NULL); 
    virtual ~Node(void); 

protected: 
    Node *next; 
    Node *prev; 
    std::string val; 
}; 

Node(std::string value = "", Node *pVal = NULL, Node *nVal = NULL) 
{ 
    next = nVal; 
    prev = pVal; 
    val = value; 
} 
+1

Вы, кажется, игнорируете аргумент 'value' в некоторых ваших конструкторах. Значения по умолчанию позволят вам написать один конструктор, но использовать его, как если бы он содержал ваши 4 определения. И вам действительно нужен «виртуальный» деструктор? Будете ли вы иметь полиморфные узлы? –

+0

Спасибо за то, что я быстро сделал копию/вставку и забыл ее отредактировать. Я также обновил его, чтобы у одного конструктора были значения по умолчанию для других, которые могли бы просмотреть это позже. Существуют ли проблемы с производительностью между виртуальным и стандартным деструктором? – LF4

+0

Да, есть. Один несет вызов виртуальной функции, другой - нет. –

ответ

1

Да - это именно то, что есть.

Вот страница с примером конструктора struct.

http://www.yolinux.com/TUTORIALS/LinuxTutorialC++Structures.html

+0

Спасибо за ссылку, я был немного смущен, так как я никогда не использовал структуру для более простых типов данных и никогда не использовал конструктор (думал, что структура не имеет функций, а это была разница между классами и их) , Это здорово знать. – LF4

+0

Разница заключается главным образом в видимости по умолчанию атрибутов и наследования (private для класса, public для struct). –

1

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

Обычно это предпочтительный способ инициализации атрибутов. вот дискуссия объясняет, почему:

Is it possible to defer member initialization to the constructor body?

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

Также вам нужны аксессоры для вашего указателя.

class Node 
{ 
public: 
    Node():next(NULL),prev(NULL),val("") {}; 
    Node(std::string value):next(NULL),prev(NULL),val(value) {}; 
    Node(std::string value, Node *pVal):next(NULL),prev(pVal),val(value) {}; 
    Node(std::string value, Node *pVal, Node *nVal):next(nVal),prev(pVal),val(value) {}; 
    virtual ~Node(void); 

    std::string getValue() 
    { 
     return val; 
    } 
    void setValue(std::string v) 
    { 
     val = v; 
    } 

    Node * getNext() 
    { 
     return next; 
    } 
    void setNext(Node * n) 
    { 
     next = n; 
    } 

    Node * getPrevious() 
    { 
     return prev; 
    } 
    void setPrevious(Node * n) 
    { 
     prev= n; 
    } 

protected: 
    Node *next; 
    Node *prev; 
    std::string val; 
}; 

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

  • Нет связанных вопросов^_^