2012-02-10 4 views
1

У меня есть класс шаблонов, который хранит коллекцию объектов с использованием массива и текущего размера. Я понял вставку и убрал. У меня проблемы с функцией isEmpty. Он возвращает false (как будто он не пуст), даже когда я добавляю слово 3 и 5, а затем удаляю 3 и 5. Затем он должен сказать true.Как вставить в массив? C++

#include <cstdio> 
#include <iostream> 
#include <cstdlib> 

/************************************************************/ 
// Local includes 

/************************************************************/ 
// Using declarations 

using namespace std; 

/************************************************************/ 
template <class T> 
class Collection 
{ 
public: 

    Collection (int mArraySize) 
    { 
    m_size = mArraySize; 
    array = new T[mArraySize]; 
    reset(); 
} 
/************************************************************/ 

int 
size() 
{ 
    return nextEmpty; 
} 

/************************************************************/ 

void 
reset() 
{ 
    nextEmpty = 0; 
    nextToRead = 0; 
} 

/************************************************************/ 

void 
insert(const T& a) 
{ 
    if (nextEmpty < m_size) 
    { 
     array[nextEmpty++] = a; 
    } 
} 

/************************************************************/ 

bool 
isEmpty() 
{ 
    if(m_size == 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

/************************************************************/ 

void 
makeEmpty() 
{ 
    m_size = 0; 
    array = NULL; 
} 

/************************************************************/ 

void 
remove(const T& r) 
{ 
    int i = 0; 
    for (i = 0; i < m_size; i++) 
    { 
     if (array[i] == r) 
     { 
      break; 
     } 
    } 
    while (i++ < m_size) 
    { 
     array[i - 1] = array[i]; 
    } 
    m_size--; 
} 

/************************************************************/ 


void 
contains(T array, T target) 
{ 

    for(int i = 0; i < m_size; i++) 
    { 

    } 
} 

/************************************************************/ 

T& 
get() 
{ 
    return array[nextToRead++]; 
} 

/************************************************************/ 

private: 

T* array; 
int nextEmpty; 
int nextToRead; 
int m_size; 
}; 

/************************************************************/ 

#include <iostream> 
#include <iterator> 

/****************************************************************************/ 
// Local includes 
#include "header.h" 

/****************************************************************************/ 
// Using declarations 

using namespace std; 

/****************************************************************************/ 
// Prototypes, typedefs, etc. 

bool 
isEmpty(); 

void 
makeEmpty(); 

void 
insert(); 

void 
remove(); 

void 
contains(); 

void 
testerFcn(); 

/****************************************************************************/ 

int main(int argc, char* pArgs[]) 
{ 
    testerFcn(); 

    return EXIT_SUCCESS; 
} 

/************************************************************/ 

void 
testerFcn() 
{ 
    Collection <int> testArray(15); 

    // insert test 
    cout << "Enter numbers to add to array (enter negative number to finish): " << endl; 

    for(;;) 
    { 
     int n; 
     cin >> n; 

     if (n < 0) { 
      break; 
     } 
     testArray.insert(n); 
    } 

    // remove test 
    cout << "Enter value to remove, (enter negative number to finish): " << endl; 

    for(;;) 
    { 
     int n; 
     cin >> n; 

     if (n < 0) { 
      break; 
     } 
     testArray.remove(n); 
    } 

    cout << "Is the array empty: 0 = false, 1 = true ==> " << testArray.isEmpty() << endl; 

    // print what we have 
    cout << "New Array: " << endl; 
    for (int i = 0; i < testArray.size(); i++) 
    { 
     cout << i << ":" << testArray.get() << endl; 
    } 
} 
+0

Это домашнее задание? Любая причина не использовать вектор? – Bart

+0

Это ваш фактический код? Это пронизано ошибками компиляции. Вы пытались скомпилировать его и запустить его для тестирования? Я предполагаю, что это домашнее задание, так что я сейчас не буду отвечать. Если это домашнее задание, самым важным советом, который я могу вам дать, является научиться использовать отладчик, скомпилировать его на ранней стадии и часто, и начать писать модульные тесты для вашей функциональности. – Chad

+0

Да, это так. Тем не менее, нам разрешили работать с другими людьми. И да, для этого курса мы только начали использовать C++, поэтому мы еще не изучили векторы. Я знаю, что они есть, но учитывая, что мы пока еще не изучили их технически, я не должен их использовать. – user1202950

ответ

2

Я предлагаю сделать небольшие шаги здесь, так как вы новичок в C++. Большая часть вашего синтаксиса неверна, и я чувствую, что вам было бы лучше иметь некоторый минимальный класс, который на самом деле компилируется, прежде чем вы будете беспокоиться о том, как копировать элементы и массивы размеров. Но так как вы получили это далеко, вот несколько общих предложений (я не буду явно писать правильный код для вас, так как это домашнее задание):

  • Вы используете T взаимозаменяемо в качестве содержащегося типа, а тип массива. Фактически вызов new T[x] дает вам указатель на т, т.е. a T*. Вам нужно понять различие между ними, чтобы изучить C или C++.

  • Функция ensureCapacity принимает два аргумента. Вы не должны принимать переменную-член m_array в качестве аргумента - на самом деле она вообще не будет делать то, что вы ожидаете здесь (для бонусных очков, подумайте о том, что это будет do). Также подумайте о том, имеет ли смысл minimumCapacity быть T.

  • Вы назначаете два новых массива в ensureCapacity и никогда delete ничего. Помните, что это C++, и вы должны как-то освободить память. Кроме того, вам действительно нужен только один новый массив большего размера - я думаю, что здесь может возникнуть небольшая путаница вокруг разницы между T и T* в отношении того, как вы можете их поменять.

  • Вы уверены, что сравнивать m_array[m_size] < minimumCapacity? Что вы здесь сравниваете и почему?

Надеюсь, это поможет. Опять же, я предлагаю вам попытаться понять основные понятия языка (которые, по общему признанию, более сложные, чем многие другие), прежде чем слишком беспокоиться о логике изменения размера массива - возможно, начиная с очень простого класса с массивом фиксированного размера и продвигаясь оттуда.

+0

В исходном вопросе много неправильного, и без какого-либо кода, чтобы заставить шаблон компилировать, вероятно, что эти ошибки еще не генерируются компилятором. Отличная отправная точка для OP, хотя. – Chad

+0

Вот что у меня есть. Я установил тест в моей основной части целочисленного массива. Из того, что я могу сказать, мои методы вставки и удаления работают. У меня возникли проблемы с isEmpty. Он возвращает, что он не пуст, хотя в точках массива есть только нули. Любая идея о том, как подойти к этой проблеме? Я добавил свой новый код к исходному вопросу. – user1202950

+0

Предположительно, 'm_size' не достигает 0, вероятно, потому, что он начинается с нуля, поэтому, если вы добавите 5 элементов и снова их удалите, он вернется туда, где он начал? Я думаю, что проблема с корнем здесь заключается в том, что вам нужно отслеживать размер выделенного массива отдельно от количества вещей, которые были помещены в него (через 'insert()' или что-то еще). Мне кажется, что вы объединяете этих двух. – Peter

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