Solved

HELP - My Vector Class won't work.

Posted on 2004-09-26
5
303 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

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

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

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
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 user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

726 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