Конструктор класса VectorList - PullRequest
0 голосов
/ 14 марта 2011

для моего задания мы создаем класс VectorList, и у меня возник вопрос о конструкторе.Это объявление класса:

#include <iostream>
#include <vector>
using namespace std;
template< typename NODETYPE >
class VectorList 
{
 public:
  VectorList(); // constructor
  ~VectorList(); // destructor

  void insertAtFront( const NODETYPE & );
  void insertAtBack( const NODETYPE & );
  bool removeFromFront( NODETYPE & );
  bool removeFromBack( NODETYPE & );
  bool isEmpty() const;
  void print() const;
 private:
  vector< NODETYPE > *vList;  // list data as a vector
};

Я думал, что для конструктора я бы использовал vList = new std :: vector;но назначение имеет это:

template< typename NODETYPE > 
VectorList< NODETYPE >::VectorList()  
: // Fill in the missing code 
{  
  // empty body 
}  

Так что я не могу поставить vList = new std :: vector;в теле конструктора так, как он хочет, чтобы он был пустым.Я не уверен, что делать в этот момент.

1 Ответ

2 голосов
/ 14 марта 2011

Ваш учитель ищет список инициализатора конструктора . Это позволяет инициализировать элементы перед запуском конструктора:

template< typename NODETYPE > 
VectorList< NODETYPE >::VectorList()  
    : vList(new std::vector)
{
}  

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

int a(3);    // Calls int constructor with 3. Note int a = 3; does same (no call to operator=)

Если у вас была переменная члена класса , объявленная как int a;, инициализация не может быть выполнена при объявлении, но помещение ее в конструктор запускает после объект уже создано. Это действительно присваивание, и оно происходит с использованием operator= вместо конструктора объекта. Это эквивалентно:

int a;    // Create an int
a = 3;    // Uses operator= to do assignment

Обратите внимание, что вы using namespace std; в том, что я предполагаю, является файлом заголовка; это плохая идея, поскольку она загрязняет пространство имен любого файла, который #include является вашим заголовком, и может потенциально привести к конфликтам имен (и, таким образом, к незначительным ошибкам). После удаления этой строки вам необходимо добавить префикс std:: перед объявлением vector< NODETYPE >.

Наконец, в коде, который вы выложили до сих пор, нет необходимости выделять vList в куче (с новым), когда вы можете иметь обычный векторный объект в качестве переменной-члена:

vector< NODETYPE > vList;

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

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