Connecting Tech Pros Worldwide Help | Site Map

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

 
LinkBack Thread Tools Search this Thread
  #1  
Old November 7th, 2005, 03:35 AM
Irish
Guest
 
Posts: n/a
Default How do I declare a template class variable and make an instance seperately?

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

}


  #2  
Old November 7th, 2005, 03:45 AM
Thomas Tutone
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?


Irish wrote:[color=blue]
> 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.[/color]

Don't declare it until you're ready to use it.
[color=blue]
> 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>'[/color]

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.

[color=blue]
> #-------------------------------------------------------------
> #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[/color]

Delete the following line entirely.
[color=blue]
> 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[/color]

For the preceding line, substitute:
HEAP<ELEMENT>B(size);
[color=blue]
>
> }[/color]

Best regards,

Tom

  #3  
Old November 7th, 2005, 04:05 AM
David White
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

Irish wrote:

[snip]
[color=blue]
> 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
> };[/color]

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

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.
[color=blue]
>
> int size;
>
> cout << "Give the desired size of this heap: " << endl;
> cin >> size;
> B(size); // I WANT TO INSTANTIATE B DOWN HERE[/color]

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.
[color=blue]
>
> }[/color]

DW


  #4  
Old November 7th, 2005, 05:15 AM
Irish
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

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...

  #5  
Old November 7th, 2005, 05:25 AM
Irish
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

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'

  #6  
Old November 7th, 2005, 05:35 AM
Irish
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

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.......


}
}
}

  #7  
Old November 7th, 2005, 05:55 AM
Josh Mcfarlane
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

Irish wrote:[color=blue]
> 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?[/color]

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

  #8  
Old November 7th, 2005, 07:15 AM
Irish
Guest
 
Posts: n/a
Default Re: How do I declare a template class variable and make an instance seperately?

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

peace, Irish

 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,840 network members.