Шаблонный класс C ++ - PullRequest
       11

Шаблонный класс C ++

1 голос
/ 13 марта 2011

Эй .. У меня проблемы с домашней работой.

Мы работаем над VectorList (вроде как связанный список, но с векторами - не спрашивайте почему ..) В любом случае у меня есть что-то вроде этого:

#ifndef VECTORLIST_H 
#define VECTORLIST_H

#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

};

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

// display contents of VectorList
template< typename NODETYPE >
void VectorList< NODETYPE >::print() const
{
  // Fill in the missing code 
} 

Моя идея заключалась в том, чтобы использовать цикл for для вектора и использовать cout<< vector[i]<< endl; распечатать вектор ..

Проблема в том, что я получаю всевозможные ошибки и ошибки сегментов.

Я не понимаю, как получить доступ к вектору в функции, и как получить доступ к его элементам.

Это заголовочный файл, и в основном мы объявляем объект VectorList<NODETYPE> IntVector ...

Так как я могу это сделать? Любая помощь в понимании того, как этот *vList играет роль, очень помогла бы и Я, вероятно, смогу закончить остальное ..

Кроме того, для isEmpty() я предполагаю, что могу использовать vList.empty() .. но поскольку vList является указателем .. это не очень хорошо работает.

== Что я могу сделать для конструктора / деструктора? Я знаю, что для деструктора я должен перебрать вектор и использовать delete для каждого элемента. Но плечо

Пожалуйста, объясни мне это, я расстроен = [

Ответы [ 2 ]

1 голос
/ 13 марта 2011

моя проблема в том, что я не понимаю, как использовать STL, когда я есть * vList .. это указатель на первый элемент вектора?

Я предполагаю, что вы должны как часть домашней работы использовать указатель на вектор вместо самого вектора. Как правило, я никогда не использую указатели на контейнеры. На самом деле, лучшее, что я обнаружил при переходе с C на C ++, это то, что я мог писать целые программы без указателей, благодаря программированию на STL. Если вам не требуется указатель на вектор, я рекомендую использовать вектор напрямую.

Конечно, использовать вектор проще, чем указатель, но не волнуйтесь. Использование указателя не так уж плохо.

Во-первых, чтобы использовать указатель на что-то , нужно выделить что-то . Итак, в вашем конструкторе, вызовите new.

vList = new std::vector<NODETYPE>;

Каждый раз, когда мы вызываем new, у нас должно быть совпадение delete. Так как наш new находится в нашем конструкторе, нам нужно вызвать delete в деструкторе:

delete vList;

Вы сказали:

но поскольку vList является указателем ... он не очень хорошо работает.

Здесь жизнь становится легче. Как правило, если p является указателем на некоторый тип, тогда (*p) является объектом, на который указывает p. Вот несколько примеров:

int i = 1;
int *pInt = &i;

i = 4;
(*pInt) = 4;
std::cout << i << " " << (*pInt) << "\n";

std::vector<NODETYPE> v;
std::vector<NODETYPE> *pVector;

v.push_back();
(*pVector).push_back();

it = v.begin();
it = (*pVector).end();

Итак, вызвать членов vList очень просто: (*vList).empty().

Итак, ваш код может быть:

void insertAtFront(const NODETYPE& node) { (*vList).push_front(node); }

Существует оператор быстрого доступа ->, который облегчает чтение приведенного выше текста:

void insertAtFront(const NODETYPE& node) { vList->push_front(node); }

Выражение x->y более или менее эквивалентно (*x).y.

Подводя итог:

Выделите vList в конструкторе с помощью new. Уничтожьте свой vList в своем деструкторе с помощью delete. Вызвать членов vList, используя (*vList).function() или vList->function().

Удачи, и возвращайтесь, если у вас есть другие вопросы!

P.s. Поскольку у вас нетривиальный деструктор, вам нужно учитывать правило трех .

P.P.s. Вы сказали что-то про итерацию вектора в вашем деструкторе и удаление каждого из объектов, которые вы там найдете. Вам нужно было бы сделать это только в том случае, если ваш тип данных был vector-of-pointers-to-NODETYPE (в отличие от того, что вы объявили: pointer-to-vector-of-NODETYPE). До тех пор, пока вы не освоитесь с указателями, я не рекомендую хранить указатели в контейнерах STL.

0 голосов
/ 13 марта 2011

Вы должны сконструировать свой объект в конструкторе (если вам действительно нужно использовать голые указатели): vList = new vector< NODETYPE >();, освободить память в деструкторе: delete vList;, преобразовать ваши методы в соответствующие методы класса контейнера.Например, insertAtBack будет реализовано как vList->push_back(elem);

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