1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Container class help

  1. Feb 15, 2007 #1

    Math Is Hard

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    C++ container class help

    Hi, I'm working on a templated container class called "bag" and running into some trouble. This my header file, bagTemplate.h
    Code (Text):
    #ifndef BAGTEMPLATE_H
    #define BAGTEMPLATE_H

    template <typename T>
    class bag {
    public:
        bag(int num=10); // construct a bag to hold num elements  
        ~bag( );                // destructor  
        int size(); //returns current size
        int count(const bag<T> & target) const;//counts # items of certain value in bag
        void insert (const bag<T> & new_item); //add one item to the bag, double cap if cap exceeded

       
    private:
        int used; // size, or number of elements currently stored in the bag
        int capacity; // the maximum capacity of the bag
        bag <T> * container;   // internal storage array of pointers to items
    };  

    #include "Bag.template"
    #endif
     
    And this is my template file, bag.template:
    Code (Text):

    #include <iostream>
    #include <stdlib.h>

    using namespace std;

    // constructor builds a bag with the ability to hold
    // capacity items; the bag is initially empty
    template <typename T>
    bag<T> :: bag(int num)
    {
        capacity = num;
        used = 0;
        container = new bag<T> [num];  
    }


    // destructor destroys the bag by recycling the memory it used
    template <typename T>
    bag<T> :: ~bag( )
    {
        delete [ ] container;
    }


    template <typename T>  
    int bag<T>::size()
    {
        return used;
    }

    template <typename T>
    int bag<T>::count(const bag<T> & target) const
    {
            int ct = 0;
            for (int i = 0; i < used; i++)
            {
                if (target == container[i])
                    c++;
            }
            return ct;
    }

    template <typename T>
    void bag<T>::insert (const bag<T> & new_item)
    {
        if (used == capacity)
            capacity = capacity * 2;
        container[used ++] = new_item;

    }
     
    Here is my driver:
    Code (Text):
    #include "bagTemplate.h"
    #include <iostream>
    using namespace std;

    int main()
    {
        cout << "test 1";  
        bag<int> b;
        cout << "test 2";  
        return 0;
    }
     
    When I run this, "test 1" prints, but "test 2" does not. It must be something simple I'm missing, as usual. I am not getting any error messages.
    Any help is appreciated. I'm using VS C++ 6 at the moment. Will be trying it in VS C++ .NET 2003 when I get home.
    tanx!
     
    Last edited: Feb 15, 2007
  2. jcsd
  3. Feb 15, 2007 #2
    Are you sure this is right?

    Code (Text):

    bag <T> * container;   // internal storage array of pointers to items
     
    You want bag to hold an array of pointers to bags? Or do you want bag to hold an array of type Ts? If you want to create an array of type T then you should use

    Code (Text):

    T * container;
     
    If you want an array of pointers to other bags, then you should use this (although I'm not entirely sure this is legitimate):

    Code (Text):

    bag <T> ** container;   // internal storage array of pointers to items
     
    I'm assuming what you want is the former case, so you have to go through your code and change things like this..

    Code (Text):

    template <typename T>
    void bag<T>::insert (const bag<T> & new_item)
    {
        if (used == capacity)
            capacity = capacity * 2;
        container[used ++] = new_item;

    }
     
    to

    Code (Text):

    template <typename T>
    void bag<T>::insert (const T & new_item)
    {
        if (used == capacity)
            capacity = capacity * 2;
        container[used ++] = new_item;

    }
     
    I might have completely misunderstood what you're trying to do, but this is what I think the problem is. By the way, if you're using VS, then just debug your code with F10, until you get to this line in main() :

    Code (Text):

    bag<int> b;
     
    You'll see that on this line an exception is thrown here. If you use F11 you can step into the calls made at this point, and you'll see that the offending bit of code is what I mentioned before.
     
  4. Feb 15, 2007 #3
    You also might want to change this:
    Code (Text):
    template <typename T>
    int bag<T>::count(const bag<T> & target) const
    {
            int ct = 0;
            for (int i = 0; i < used; i++)
            {
                if (target == container[i])
                    c++;
            }
            return ct;
    }
    to read ct++ instead of c++ ?
     
  5. Feb 15, 2007 #4

    Math Is Hard

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    thanks! good catches! I appreciate the help!
    I'm trying to sort of kluge things together based on a templated link list class example we had in class so it's been a confusing process.
    And yes, I'm trying to hold an array of type Ts, but we have to expand it dynamically as needed.
     
    Last edited: Feb 15, 2007
  6. Feb 15, 2007 #5
    Well if you're getting confused about whether you should be putting bag<T> or T then the best thing to do is to just write your class for integers only (ignoring templates for the time being), make sure all the methods work and so on. When you're satisfied it's working, then go through your code and generalise it to use a template. So where you would have "class bag{}" and "int *container" and so on, change it to read "template<typename T> class bad{};" and "T *container" etc. This might help.
     
  7. Feb 16, 2007 #6

    Math Is Hard

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    Thank you. You're absolutely right. I'll see if I can get everything going for one data type. The templating has been driving me nuts because it's been an extra layer of abstraction while I'm still trying to get a grasp of the fundamentals of classes.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Container class help
  1. Class A amplifier (Replies: 2)

Loading...