проблема с шаблоном класса - PullRequest
       1

проблема с шаблоном класса

1 голос
/ 15 августа 2011

У меня есть домашняя работа, но я не очень хорошо знаком с шаблонами классов.

Задача:

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

    template <class T>
class Array
{
private:
    T *m_pData;
    unsigned int m_nSize;

public:
  Array(unsigned int nSize) : m_nSize(nSize)
  {
    if(m_nSize > 0)
      m_pData = new T[m_nSize];
  }

virtual ~Array()
  {
    if(m_pData != NULL)
      delete m_pData;
  }
bool Set(unsigned int nPos, const T& Value)
  {
    if(nPos < m_nSize)
    {
      m_pData[nPos] = Value;
      return true;
    }
    else
      return false;
  }

  T Get(unsigned int nPos)
  {
    if(nPos < m_nSize)
      return m_pData[nPos];
    else
      return T();
  }
};

Насколько я понимаю, есть утечка памяти. Вы замечаете другие проблемы? Намеки приветствуются точнее, чем точные ответы;)

Ответы [ 4 ]

2 голосов
/ 15 августа 2011
  1. Конструктор - Вам необходимо установить значение m_pData, если nSize равно 0
  2. . Вы можете удалить нулевые указатели, так что оператор if не требуется в деструкторе.Удалить следует удалить []
1 голос
/ 15 августа 2011

Нет конструктора копирования или оператора присваивания.Этот код очень быстро вылетит из вашей программы.Это главный недостаток.

Создание виртуального деструктора - странное решение.Нет очевидной необходимости или выгоды для этого класса.

Я бы тоже реализовал метод подкачки.

1 голос
/ 15 августа 2011

В конструкторе: if без else.Примите во внимание последствия.
Убедитесь, что new [] сопоставлено с delete [], а новое с delete.
Это нарушает правило 3 (или 5 с C ++ 0x)

Это все, что ясм.

0 голосов
/ 15 августа 2011

Вот несколько вещей, но я сомневаюсь, что любая из них достаточно серьезна, чтобы быть правильным ответом:

  1. функция get возвращает значение для недопустимых индексов.если бы type T было int с, а вы использовали get со слишком большим индексом, ответ, который вы получили бы, был бы 0. Что если значения могут быть 0?как определить разницу между значением 0 и недопустимым значением индекса?

  2. есть дополнительный код: вам не нужен else return

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