![]() |
| | #1 |
| Registered User Join Date: Apr 2005
Posts: 21
| Class Template Trouble Code: #ifndef _ARRAY_HPP_
#define _ARRAY_HPP_
#include <iostream> // for cout, cin
#include <exception> // for exception base class
#include <new> // for bad_alloc
template <typename Type>
class Array
{
private:
// Holds the size of the array
unsigned len;
// Pointer for dynamically allocated array
Type * array;
public:
// Constructor with array size explicitly provided
explicit Array(unsigned arraySize = 0);
// Homogeneous copy constructor
Array(const Array<Type> & ST_Array);
// Heterogeneous copy constructor, can take a different type of array as argument
template <typename U>
Array(const Array<U> & DT_Array);
// Overloaded bracket operator const version
const Type & operator[](unsigned i) const;
// Overloaded bracket operator non-const version
Type & operator[](unsigned i);
// Homogeneous assignment operator
Array<Type> & operator=(const Array<Type> & a);
// Heterogeneous assignment operator
template <typename U>
Array<Type> & operator=(const Array<U> & a);
// Returns the size of the array
unsigned Size(void) const;
// Destructor
~Array(void);
};
// ***********Implementation************
template <typename Type>
Array<Type>::Array(unsigned arraySize) : len(arraySize)
{
array = new Type[len];
}
// Returns the size of the array
template <typename Type>
unsigned Array<Type>::Size(void) const
{
return this->len;
}
// Homogeneous copy constructor
template <typename Type>
Array<Type>::Array(const Array<Type> & ST_Array)
{
len = ST_Array.len;
array = new Type[len];
for (unsigned i = 0; i < len; i++)
array[i] = ST_Array[i];
}
// Heterogeneous copy constructor, can take a different type of array as argument
template <typename Type>
template <typename U>
Array<Type>::Array(const Array<U> & DT_Array)
{
len = DT_Array.Size();
array = new Type[len];
for (unsigned i = 0; i < len; i++)
array[i] = Type(DT_Array[i]);
}
// Overloaded bracket operator const version
template <typename Type>
const Type & Array<Type>::operator[](unsigned i) const
{
return array[i];
}
// Overloaded bracket operator non-const version
template <typename Type>
Type & Array<Type>::operator[](unsigned i)
{
return array[i];
}
// Homogeneous assignment operator
template <typename Type>
Array<Type> & Array<Type>::operator=(const Array<Type> & a)
{
if (this != &a)
{
delete [] array;
array = new Type[a.len];
for (unsigned i = 0; i < len; i++)
array[i] = a[i];
}
return *this;
}
// Heterogeneous assignment operator
template <typename Type>
template <typename U>
Array<Type> & Array<Type>::operator=(const Array<U> & a)
{
delete [] array;
len = a.Size();
array = new Type[len];
for (unsigned i = 0; i < len; i++)
array[i] = Type(a[i]);
return *this;
}
// Destructor
template <typename Type>
Array<Type>::~Array(void)
{
delete [] array;
}
#endif
Code: #include <iostream>
#include "Array.hpp"
using namespace std;
int main(void)
{
Array<float> a(1);
return 0;
}
Code: C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xstring(32): fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 2701)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Last edited by pliang; 04-21-2005 at 02:53 AM. |
| pliang is offline | |
| | #2 |
| Registered User Join Date: Nov 2003
Posts: 712
| Start by correcting following errors: Size returns unsigned so that line should be: Code: unsigned Array<Type>::Size(void)
__________________ Gotta love the "please fix this for me, but I'm not going to tell you which functions we're allowed to use" posts. It's like teaching people to walk by first breaking their legs - muppet teachers! - Salem |
| Micko is offline | |
| | #3 |
| Registered User Join Date: Apr 2005
Posts: 21
| Yay, it works now. I knew it was something stupid like that, thanks a lot Micko! I got another quest though, why do I have to make my unsigned Size(void) const; a const member function? I was getting error from my copy constructor when I didn't put the const at the end. |
| pliang is offline | |
| | #4 |
| Registered User Join Date: Nov 2003
Posts: 712
| I'm not sure because this works for me: Code: //dec....
// Returns the size of the array
unsigned Size(void);
//imp...
template <typename Type>
unsigned Array<Type>::Size(void)
{
return this->len;
}
Code: const Array<float> b(a); b.Size(); It's not a bad practice do declare/define functions that don't change object to const... - Micko
__________________ Gotta love the "please fix this for me, but I'm not going to tell you which functions we're allowed to use" posts. It's like teaching people to walk by first breaking their legs - muppet teachers! - Salem Last edited by Micko; 04-21-2005 at 03:13 AM. |
| Micko is offline | |
| | #5 |
| Cat without Hat Join Date: Apr 2003
Posts: 8,439
| You can only call const methods on a const object. Thefore, if none of your methods are const, a const object is completely useless. As copy constructors and similar functions are passed references to const objects, the objects must have some const functions. Size(), since it doesn't change the object, is a perfect candidate for this.
__________________ All the buzzt! CornedBee"There is not now, nor has there ever been, nor will there ever be, any programming language in which it is the least bit difficult to write bad code." - Flon's Law |
| CornedBee is offline | |
![]() |
| Thread Tools | |
| Display Modes | |
|
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Getting an error with OpenGL: collect2: ld returned 1 exit status | Lorgon Jortle | C++ Programming | 6 | 05-08-2009 08:18 PM |
| Template class nested in template class | yahn | C++ Programming | 7 | 04-18-2009 11:40 AM |
| Function template has already been defined | Elysia | C++ Programming | 19 | 04-14-2009 10:17 AM |
| Message class ** Need help befor 12am tonight** | TransformedBG | C++ Programming | 1 | 11-29-2006 11:03 PM |
| Declare a template class as a friend? | AH_Tze | C++ Programming | 11 | 05-19-2004 09:24 PM |