2012-02-10 222 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 2012-02-10 21:45:18

+0

这是你的真实码吗?它充斥着编译错误。你有没有试过编译它并运行它来测试?我假设这是家庭作业,所以我现在暂缓回答。如果这是作业,我可以给你的最重要的建议是学会使用调试器,尽早编译并开始编译,并开始为你的功能编写单元测试。 – Chad 2012-02-10 21:48:07

+0

是的。我们可以和其他人一起工作。是的,对于这门课程,我们刚开始使用C++,所以我们还没有学习矢量。我知道他们是什么,但考虑到我们还没有从技术上了解他们,我不应该使用他们。 – user1202950 2012-02-10 21:49:29

回答

2

由于您是C++新手,我建议您在这里采取小步骤。你的语法大部分都是不正确的,我觉得你可以做更好的事情,让你在担心复制项目和调整数组大小之前真正编译一些最小类。但既然你走了这么远,这里有一些一般性的建议(我不会明显写正确的代码为你因为这是家庭作业):

  • 您正在使用T互换作为您的包含的类型和数组的类型。实际上,调用new T[x]会给你一个指向t的指针,即。一个T*。您需要了解两者之间的区别以学习C或C++。

  • 您的ensureCapacity函数有两个参数。你不应该把成员变量m_array作为一个参数 - 它实际上根本不会做你想要的东西(对于奖励积分,想想会做什么)。同样考虑一下minimumCapacity是否也是T

  • 您在ensureCapacity中分配了两个新阵列,从来没有delete任何东西。请记住,这是C++,你必须以某种方式释放内存。另外,你应该只需要一个新的,更大的阵列 - 我想这里可能会有一些困惑,围绕着TT*之间的区别,关于如何交换它们。

  • 你确定比较m_array[m_size] < minimumCapacity?你在这里比较什么?为什么?

我希望这有些帮助。再次,我建议你在掌握基本的语言概念之前(尽管它比许多其他技术更加棘手),然后再担心调整数组大小的逻辑 - 可能从一个非常简单的具有固定大小数组的类开始,从那里前进。

+0

原始问题存在很多错误,如果没有任何代码强制模板编译,那么编译器可能还没有生成这些错误。虽然OP有很好的起点。 – Chad 2012-02-10 22:33:33

+0

这是我到目前为止。我在我的一个整数数组的主体中设置了一个测试。从我可以告诉我,我的插入和删除方法的工作。我对isEmpty有困难。即使数组点中只有零,它也会返回它不为空。任何想法如何解决这个问题?我将我的新代码添加到原始问题中。 – user1202950 2012-02-12 19:15:27

+0

推测'm_size'没有降到0,可能是因为它开始非零,所以如果你添加5个项目并再次删除它,它只能回到它开始的位置?我认为这里的根本问题是,你需要跟踪已分配数组的大小(通过insert()或其他)。它看起来像你在混淆两者。 – Peter 2012-02-15 23:05:32