Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

HELP - My Vector Class won't work.

Posted on 2004-09-26
5
Medium Priority
?
308 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 500 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

Independent Software Vendors: 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

Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.

610 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