2012-02-10 2 views
1

배열과 현재 크기를 사용하여 객체 컬렉션을 저장하는 템플릿 클래스가 있습니다. 나는 삽입물을 알아 내고 제거했다. isEmpty 기능에 문제가 있습니다. 그것은 마치 3과 5를 추가하고 3과 5를 제거한다고해도 false을 반환합니다 (비어 있지 않은 것처럼). 그러면 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]을 호출하면 포인터를 t로 바꿀 수 있습니다. a T*. C 또는 C++을 배우려면이 둘 사이의 구별을 이해해야합니다.

  • ensureCapacity 함수에는 두 가지 인수가 사용됩니다. 회원 변수 m_array을 인수로 사용해서는 안됩니다. 여기에서 기대하는 바를 전혀 수행하지 않습니다 (보너스 포인트는 일 것입니다). 또한 minimumCapacityT이 될 수 있는지 생각해보십시오.

  • 두 개의 새로운 배열을 ensureCapacity에 할당하고 결코 delete을 할당하지 마십시오. 이것은 C++이며 메모리를 여유롭게 사용해야한다는 것을 기억하십시오. 또한 실제로는 하나의 새롭고 큰 배열이 필요합니다.과 T*의 차이점을 약간 혼란스럽게 생각할 수 있습니다.

  • m_array[m_size] < minimumCapacity에 대한 확실한가요? 왜 여기와 비교하면 뭡니까?

나는 그것이 도움이되기를 바랍니다. 다시 말하지만, 배열의 크기를 조정하는 논리에 대해 너무 많이 걱정하기 전에 기본 언어 개념 (많은 다른 언어보다 더 까다 롭습니다)에 익숙해 지려고 시도하는 것이 좋습니다. 고정 크기 배열로 매우 간단한 클래스부터 시작하고 거기에서 앞으로 나아 간다.

+0

원래의 질문에는 많은 잘못이 있으며, 템플릿을 강제로 컴파일하는 코드가 없으면 이러한 오류가 컴파일러에 의해 아직 생성되지 않은 것일 수 있습니다. 그래도 OP를위한 좋은 출발점. – Chad

+0

내가 지금까지 가지고있는 것이있다. 필자는 정수 배열의 메인에 테스트를 설정했습니다. 내가 말할 수있는 것부터, 삽입과 제거 방법이 효과가있다. isEmpty에 문제가 있습니다. 배열 영역에 0 만 있어도 공백이 아니라고 반환합니다. 이 문제에 접근하는 방법에 대한 아이디어가 있습니까? 원래 질문에 새 코드를 추가했습니다. – user1202950

+0

아마도'm_size'는 0으로 떨어지지 않을 것입니다. 아마도 0이 아닌 값으로 시작하기 때문입니다. 그래서 5 개의 항목을 추가하고 다시 제거하면 시작 부분으로 돌아갑니다. 여기서 근본적인 문제는 할당 된 배열의 크기를'insert() '등을 통해) 들어간 수에 따라 따로 따로 추적해야한다는 것입니다. 네가 두 사람을 모으고있는 것처럼 나에게 보인다. – Peter

관련 문제