2016-07-23 7 views
0

So habe ich diesen Code, den ich geschrieben habe. Ich verstehe, dass es sehr einfach ist und wahrscheinlich niemals so gemacht werden sollte. Ich habe nur versucht, es zur Arbeit zu bringen. Das Problem ist, wenn meine push_back-Funktion aufgerufen wird, sind alle Variablen plötzlich durcheinander und es funktioniert nicht. So wie die Vektorgröße 1 wird und die Begrenzung eine zufällige große Zahl wird. Ich habe mich gefragt, was los ist und wie ich es beheben kann. Erstellen einer Vektorklasse C++ Fehler

Dies ist der Code für die Vektorklasse

#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]; 
} 

Dies ist der Code für das Treiberprogramm ist es zu testen.

// 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; 
} 
+0

Wenn Sie unten abstimmen möchten, bitte, aber sagen Sie mir auch, warum Sie unten abstimmen, damit ich für andere klären kann. – Mindstormer

+0

lesen Sie Implementierungen von dem, was Sie implementieren möchten, bevor Sie versuchen, etwas Ähnliches zu implementieren. Informiere dich auch über RAII! [stl_vector.h] (https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/api/a01638_source.html), [stl_vector.tcc] (https://gcc.gnu.org/onlinedocs /gcc-6.1.0/libstdc++/api/a01719_source.html), [Vektorref.] (https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/api/a01032.html). – mash

+0

Es ist nicht klar, welche Art von Fehler Sie bekommen, so dass Ihre Frage nicht klar ist. Posten Sie bei [codereview] (https://codereview.stackexchange.com) wenn Sie daran interessiert sind, warum Sie bestimmte Dinge nicht auf bestimmte Arten schreiben sollten. – mash

Antwort

0

Sie sind nicht die privaten Mitglieder Ihrer Klasse zeigt, aber unter der Annahme, dass cap die Größe des zugeordneten Speichers, während vectorSize die tatsächliche Größe ist, könnte die push_back Funktion sein:

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; 
} 

Bitte Beachten Sie, dass es viele andere Probleme gibt, wie den Konstruktor, der die Kapazität festlegt, ohne Speicher zuzuweisen oder einen Destruktor zu haben. Denken Sie auch daran, dass werfen könnte.

Verwandte Themen