创建向量类c ++错误

时间:2016-07-23 13:36:47

标签: c++ class vector

所以我写了这个代码。我知道这是非常基本的,可能永远不应该这样做。我只是想让它发挥作用。问题是当我的push_back函数被调用时,所有变量都突然混乱并且无法工作。例如,矢量化变为1,并且上限变为一些随机的大数。我想知道发生了什么以及如何解决它。

这是矢量类的代码

#include "MyVector.h"

void MyVector::grow()
{
    if (cap == 0)
        cap = MINCAP;
    else
        cap = cap*MINCAP;
    int* temp = new int[cap];
    for (int i = 0; i < vectorSize; i++)
    {
        temp [i] = theVector[i];
    }
    delete[] theVector;
    theVector = temp;
}

MyVector::MyVector()
{
    clear();
}

MyVector::~MyVector()
{
}

MyVector::MyVector(int _cap)
{
    cap = _cap;
}

int MyVector::size()
{
    return vectorSize;
}

int MyVector::capacity()
{
    return cap;
}

void MyVector::clear()
{
    vectorSize = 0;
    cap = MINCAP;
    delete(theVector);
    theVector = new int[MINCAP];
}

void MyVector::push_back(int n)
{
    if (vectorSize+1 >= cap) 
    {
        grow();
        theVector[vectorSize] = n;
    }
    else 
    {
        theVector[vectorSize] = n;
    }
}

int MyVector::at(int _location)
{
    return theVector[_location];
}

这是驱动程序测试它的代码。

// Project #12 Implementation file for the driver
// CS 1400  (your section)
// Your name
// the date
// ------------------------
#include "driver.h"

int main()
{
    // Create a default vector 
    MyVector sam;

    // push some data into sam
    cout << "\nPushing three values into sam";
    //It seems to be happening right here when the function is called
    sam.push_back(TEST_VALUE1);
    sam.push_back(TEST_VALUE2);
    sam.push_back(TEST_VALUE3);

    cout << "\nThe values in sam are: ";

    // test for out of bounds condition here
    // and test exception 
    for (int i = 0; i < sam.size() + 1; i++)
    {
        try
        {
            cout << sam.at(i) << " ";
        }
        catch (int badIndex)
        {
            cout << "\nOut of bounds at index " << badIndex << endl;
        }
    }
    cout << "\n--------------\n";

    // clear sam and display its size and capacity
    sam.clear();
    cout << "\nsam has been cleared.";
    cout << "\nSam's size is now " << sam.size();
    cout << "\nSam's capacity is now " << sam.capacity() << endl;
    cout << "---------------\n";

    // Push 12 values into the vector - it should grow
    cout << "\nPush 12 values into sam.";
    for (int i = 0; i < MAX; i++)
        sam.push_back(i);

    cout << "\nSam's size is now " << sam.size();
    cout << "\nSam's capcacity is now " << sam.capacity() << endl;
    cout << "---------------\n";

    cout << "\nTest to see if contents are correct...";
    // display the values in the vector
    for (int i = 0; i < sam.size(); i++)
    {

        cout << sam.at(i) << " ";
    }
    cout << "\n--------------\n";

    cout << "\n\nTest Complete...";

    cout << endl;
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您没有显示您的类的私有成员,但假设cap是已分配内存的大小,而vectorSize是push_back函数的实际大小:

void MyVector::push_back(int n)
{
    if ( vectorSize == cap )
    // if it's full ^^ needs more space
    {
        grow();
    }
    theVector[vectorSize] = n;
    // update the size after insertion
    ++vectorSize;
}

请注意,还有许多其他问题,例如构造函数设置容量而不分配任何内存或缺少析构函数。还要记住,new可能会抛出。