Solved

HELP - My Vector Class won't work.

Posted on 2004-09-26
5
302 Views
Last Modified: 2013-12-14
Hey. I recently made a vector, and I thought everything was smooth sailing, however, I tried to construct an object of my vector class with typename std::string, and it didn't work. It gave me an assertion, and I can't seem to figure out why. Here is my code, up to my index operator:

#ifndef VECTOR_H
#define VECTOR_H

#include<iostream>

template <typename T>
class vector
{
public:
      //Default Constructor
      vector();

      //Destructor
      ~vector();

      //Copy Constructor
      vector(const vector<T>&);

      //Assignment Operator
      vector<T>&operator=(const vector<T>&);

      //Index Operator
      T& operator[](unsigned int);

      //Equivalence
      bool operator==(const vector<T>&);

      //Returns the actual number of elements
      unsigned int size() const;

      //Append a copy of an element to the end of vector<T>
      void push_back(const T&);

      //Remove last appended element
      void pop_back();

      //Clears all items
      void clear();

      //Reserves specified amount of memory for vector<T>
      void reserve(unsigned int);

private:
      unsigned int THE_SIZE;                                    
      unsigned int THE_ARRAY_CAPACITY;                  
      T* theDataPtr;
};

const unsigned int INTIAL_Capacity = 10;

template <typename T>
vector<T>::vector()
{
      theDataPtr = new T[INTIAL_Capacity];
      THE_SIZE = 0;
      THE_ARRAY_CAPACITY = INTIAL_Capacity;
}

template <typename T>
vector<T>::~vector()
{

      delete theDataPtr;
}

template <typename T>
vector<T>::vector(const vector<T>& org)
{
       T* TempPtr = new T[(org.THE_ARRAY_CAPACITY)];
       for(unsigned int i=0; i<org.THE_SIZE; i++)
       {
             TempPtr[i] = org.theDataPtr[i];
       }
       (*this).THE_ARRAY_CAPACITY = org.THE_ARRAY_CAPACITY;
     (*this).THE_SIZE = org.THE_SIZE;
       (*this).theDataPtr = TempPtr;
}

template <typename T>
vector<T>&vector<T>::operator=(const vector<T>& rhs)
{
      if((*this) == rhs)
      {
            return *this;
      }
      else
      {
            T* TempPtr = new T[(rhs.THE_ARRAY_CAPACITY)];
            for(unsigned int i=0; i<rhs.THE_SIZE; i++)
            {
                  TempPtr[i] = rhs.theDataPtr[i];
            }            
            (*this).THE_SIZE = rhs.THE_SIZE;
            (*this).THE_ARRAY_CAPACITY = rhs.THE_ARRAY_CAPACITY;
            delete[](*this).theDataPtr;
            (*this).theDataPtr = TempPtr;
            return *this;
      }
}

template <typename T>
T& vector<T>::operator[](unsigned int pos)
{
    if(pos < THE_ARRAY_CAPACITY && pos < THE_SIZE)
    {
         return theDataPtr[pos];
    }
    else
      {
            try
            {
                  if(pos >= THE_SIZE) throw "Out of Range";
            }
            catch ( char*str)
            {
                  std::cerr << "Exception: " << str << std::endl;
            }
            return theDataPtr[(pos+THE_ARRAY_CAPACITY+THE_SIZE)];
    }
}

Then this is my main.cpp:

#include "vector.h"
#include <iostream>
#include <string>


int main()
{
      vector<string> yep;
      return EXIT_SUCCESS;
}

However, this won't work. I require assistance, please.
0
Comment
Question by:christboypcx
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
5 Comments
 
LVL 30

Expert Comment

by:Axter
ID: 12155403
You're using the wrong delete operator
0
 
LVL 30

Expert Comment

by:Axter
ID: 12155406
Should be the following:

template <typename T>
vector<T>::~vector()
{

    delete [] theDataPtr;
}
0
 
LVL 30

Expert Comment

by:Axter
ID: 12155413
If you use the new[] operator, then you have to use the delete[] operator to free the memory.
0
 

Author Comment

by:christboypcx
ID: 12155420
Wow, I could actually kick myself. I have a question then, how come it worked for other typenames, but not std::string?
0
 
LVL 30

Accepted Solution

by:
Axter earned 125 total points
ID: 12155431
>>other typenames, but not std::string?

On some compilers it might work for POD types, but not for complex types.
std::string is a complex type.

A POD type is a type that does not need a constructor or destructor, and that has only POD type members.
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

738 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question