How do I declare a template class variable and make an instance seperately?

Discussion in 'C++' started by Irish, Nov 7, 2005.

  1. Irish

    Irish Guest

    Hello all :)
    Hopefully someone can shed some light on this problem I'm having. I'm
    trying to declare a variable to a type of class I've defined (which is
    a minHeap), but actually instantiate it later when I get a command from
    the user. This is my class and if you look down a lil you can see what
    I'm trying to do in my main(). I want to ask for the size from the
    user, but when I try to I can't get my code to compile. Here is the
    class definition and the constructor. This is the error I'm getting.

    /Users/ci/minheap/minheap.h:42: error: prototype for 'HEAP<T>::HEAP()'
    does not match any in class 'HEAP<T>'

    I've been reading up on smart pointers but i'm not sure if that's what
    I'm suppose to be using. Any help/info would help me alot.......
    THANKS

    #-------------------------------------------------------------
    #include <cstdlib>
    #include <iostream>
    using namespace std;

    struct ELEMENT{int key;};

    template<class T>
    class HEAP {
    public:
    HEAP(int n);
    ~HEAP(){ delete [] heap;}
    T Min(){if (CurrentSize == 0)
    throw OutOfBounds();
    return heap[0];}

    HEAP<T>& Insert(int k);
    int DeleteMin();

    void printHeap() const;

    private:
    int CurrentSize, Capacity;
    T *heap; // element array
    };

    template<class T>
    HEAP<T>::HEAP(int n){ //constructor.
    Capacity = n;
    cout << "Heap's Capacity is: " << Capacity << endl;
    heap = new ELEMENT[Capacity];
    CurrentSize = 0;
    }

    int main(void){

    HEAP<ELEMENT> A(10); //THIS WORKS FINE
    HEAP<ELEMENT> B; // I CAN'T DO THIS THOUGH...why?? how can
    I??

    int size;

    cout << "Give the desired size of this heap: " << endl;
    cin >> size;
    B(size); // I WANT TO INSTANTIATE B DOWN HERE

    }
    Irish, Nov 7, 2005
    #1
    1. Advertising

  2. Irish wrote:
    > Hello all :)
    > Hopefully someone can shed some light on this problem I'm having. I'm
    > trying to declare a variable to a type of class I've defined (which is
    > a minHeap), but actually instantiate it later when I get a command from
    > the user.


    Don't declare it until you're ready to use it.

    > This is my class and if you look down a lil you can see what
    > I'm trying to do in my main(). I want to ask for the size from the
    > user, but when I try to I can't get my code to compile. Here is the
    > class definition and the constructor. This is the error I'm getting.
    >
    > /Users/ci/minheap/minheap.h:42: error: prototype for 'HEAP<T>::HEAP()'
    > does not match any in class 'HEAP<T>'


    Because you haven't defined a default constructor ... but you actually
    don't need it, if you just defer declaring the variable until you need
    it.


    > #-------------------------------------------------------------
    > #include <cstdlib>
    > #include <iostream>
    > using namespace std;
    >
    > struct ELEMENT{int key;};
    >
    > template<class T>
    > class HEAP {
    > public:
    > HEAP(int n);
    > ~HEAP(){ delete [] heap;}
    > T Min(){if (CurrentSize == 0)
    > throw OutOfBounds();
    > return heap[0];}
    >
    > HEAP<T>& Insert(int k);
    > int DeleteMin();
    >
    > void printHeap() const;
    >
    > private:
    > int CurrentSize, Capacity;
    > T *heap; // element array
    > };
    >
    > template<class T>
    > HEAP<T>::HEAP(int n){ //constructor.
    > Capacity = n;
    > cout << "Heap's Capacity is: " << Capacity << endl;
    > heap = new ELEMENT[Capacity];
    > CurrentSize = 0;
    > }
    >
    > int main(void){
    >
    > HEAP<ELEMENT> A(10); //THIS WORKS FINE


    Delete the following line entirely.

    > HEAP<ELEMENT> B; // I CAN'T DO THIS THOUGH...why?? how can
    > I??
    >
    > int size;
    >
    > cout << "Give the desired size of this heap: " << endl;
    > cin >> size;
    > B(size); // I WANT TO INSTANTIATE B DOWN HERE


    For the preceding line, substitute:
    HEAP<ELEMENT>B(size);

    >
    > }


    Best regards,

    Tom
    Thomas Tutone, Nov 7, 2005
    #2
    1. Advertising

  3. Irish

    David White Guest

    Irish wrote:

    [snip]

    > template<class T>
    > class HEAP {
    > public:
    > HEAP(int n);
    > ~HEAP(){ delete [] heap;}
    > T Min(){if (CurrentSize == 0)
    > throw OutOfBounds();
    > return heap[0];}
    >
    > HEAP<T>& Insert(int k);
    > int DeleteMin();
    >
    > void printHeap() const;
    >
    > private:
    > int CurrentSize, Capacity;
    > T *heap; // element array
    > };


    [snip]

    > int main(void){
    >
    > HEAP<ELEMENT> A(10); //THIS WORKS FINE
    > HEAP<ELEMENT> B; // I CAN'T DO THIS THOUGH...why?? how can
    > I??


    Your class does not contain a default constructor (one that requires no
    arguments passed to it). That's what the above is trying to do.

    >
    > int size;
    >
    > cout << "Give the desired size of this heap: " << endl;
    > cin >> size;
    > B(size); // I WANT TO INSTANTIATE B DOWN HERE


    In that case, remove the erroneous line at the top and do this here:
    HEAP<ELEMENT> B(size);

    You can't define an object but delay its "instantiation" till later in the
    function. Defining it is what instantiates it.

    >
    > }


    DW
    David White, Nov 7, 2005
    #3
  4. Irish

    Irish Guest

    Thanks Tom...... that works! But how come it doesn't work if I put it
    into a switch statement's case block? Like if I change my main to:

    int main(void){

    int go = 1, size;
    char command1;

    while(go == 1){
    cin >> command1;
    switch(command1){
    case 'c':
    case 'C':
    cin >> size;
    HEAP<ELEMENT> B(size); //THIS GIVES ME AN ERROR??
    break;

    case 's': //STOP PROGRAM
    case 'S':
    return 0;
    break;
    //etc.......
    }
    }
    }

    I get the error...
    Irish, Nov 7, 2005
    #4
  5. Irish

    Irish Guest

    whoops forgot this
    /Users/ci/minheap/main.cpp:46: error: jump to case label
    /Users/ci/minheap/main.cpp:41: error: crosses initialization of
    'HEAP<ELEMENT> B'
    Irish, Nov 7, 2005
    #5
  6. Irish

    Irish Guest

    K.... well I played with it a lil longer and I found a fix but I don't
    know why this way works and not the other...... can anyone explain for
    me?

    Thanks in advance :)
    Chris

    int main(void){

    int go = 1, size;
    char command1;

    HEAP<ELEMENT> *heap;

    while(go == 1){
    cin >> command1;
    switch(command1){
    case 'c':
    case 'C':
    cin >> size;
    heap = new HEAP<ELEMENT>(size)
    break;

    case 's': //STOP PROGRAM
    case 'S':
    return 0;
    break;
    //etc.......


    }
    }
    }
    Irish, Nov 7, 2005
    #6
  7. Irish wrote:
    > K.... well I played with it a lil longer and I found a fix but I don't
    > know why this way works and not the other...... can anyone explain for
    > me?


    Think about scope.

    In your previous switch statement, think about it like this
    (pseudo-code)

    {
    //Some stuff
    {
    int b;
    }
    //Can't use b here, as it's out of scope now.
    }

    b is no longer a valid variable once you reach the second comment line.
    You were declaring it then attempting to use it after it was no longer
    in scope.

    However, when you do something like this:
    {
    int* b;
    {
    b = new int;
    }
    //Use *b here
    delete b;
    }

    Now, b is declared in a shallow'er scope and is still in scope (the
    same one as the current control path) when you attempt to use it.

    HTH,
    Josh McFarlane
    Josh Mcfarlane, Nov 7, 2005
    #7
  8. Irish

    Irish Guest

    Ahhhhh..... thanks for the good explanation :p

    peace, Irish
    Irish, Nov 7, 2005
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. JROBINSON
    Replies:
    1
    Views:
    364
  2. christopher diggins
    Replies:
    16
    Views:
    730
    Pete Becker
    May 4, 2005
  3. =?gb2312?B?wfXquw==?=
    Replies:
    10
    Views:
    684
    Victor Bazarov
    Aug 1, 2007
  4. smoky_flame
    Replies:
    1
    Views:
    278
    Michael Nemtsev [MVP]
    Mar 15, 2008
  5. ed
    Replies:
    9
    Views:
    118
    M. Edward (Ed) Borasky
    Jun 24, 2007
Loading...

Share This Page