Creating a Template

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • randysimes
    New Member
    • Oct 2009
    • 54

    #1

    Creating a Template

    I am making a previous program into a template to calculate all 11 options. (int, double, long double, char, etc) I believe I have the right idea, but the syntax is way off. Could you please provide some insight as to how to at least set one function up, or something that I could use to finish setting up the rest. I can provide the previous program if if would help.
    Thanks in advance!
    Code:
    #include <iostream>
    #include <cstdlib>
    #include <iostream>
    
    #ifndef _TSTATS_H
    #define _TSTATS_H
    
    template <typename T>
    class TStats;
    
    template <typename T>
    void ReadData(TStats<T>&);
    
    template <typename T>
    void DisplayData(const TStats<T>&, std::ostream& os, char ofc = ' ');
    
    const size_t max = 100; //Array max
    
    template <typename T>
    class TStats
    {
    public:
    
      TStats  () ;
      ~TStats () ;
      TStats  (TStats<T>&) ;
    
      T& operator =   (T&) ;
    
      T Mean         () const ;
      T Median       () ;
      void Sort         () ;
    
      size_t Size         () const ;
      
    private:
    
      size_t size_;
      T *  data_;
      bool   sorted_;
    
      static void  Swap   (TStats<T>& x, TStats<T>& y);
    };
    
    template <typename T>
    TStats<T>::TStats(const TStats<T>& s){;}
    
    
    template <typename T>
    void ReadData(TStats<T>& s)
    {
      std::cout <<"Enter up to 100 integers seperated by spaces." << std::endl;
      std::cout << "Enter x and press enter to quit: ";
      
      
      int numbers[max]; //Intitializes array for integer entry to hold up to 100 integers
      size_t size = 0;
      
      while((std::cin >> numbers[size]) && (size < max)) //Allows for entry of all numbers at one
        size++;
      (s.SetData(numbers, size)); 
    }
    
    template <typename T>
    void DisplayData(TStats<T> const& s, std::ostream& os, char ofc)
    {
      int data [s.Size()];
      s.RetrieveData(data);
      for(size_t i = 0; i < s.Size(); ++i)
      {
    	  os << data[i] << ofc; //Displays each element of array seperated by a space
      }
      std::cout << std::endl;
    
    }
    
    template <typename T>
    TStats<T>::TStats(): size_(0), data_(0), sorted_(0)
    {
    	data_ = new int[max];
    }
    
    template <typename T>
    TStats<T>::~TStats()
    {
    	delete [] data_; //destructor
    }
    
    template <typename T>
    TStats<T>::TStats(const TStats<T>& a)
    {
    	data_ = new int [size_];
    	for (size_t i = 0; i < size_; ++i)
    		data_[i] = a.data_[i];
     
    }
    
    template <typename T>
    TStats&<T> TStats::operator = (const TStats<T>& s)
    {
      delete [] data_; //deallocate data_
      size_ = s.size_;
      data_ = new int [size_];
      for (size_t i = 0; i < size_; ++i)
        data_[i] = s.data_[i];
      return *this; //copies entered array into data_
    
    }
    
    template <typename T>
    double TStats<T>::Mean() const
    {
      float sum = 0; 
      for (size_t j = 0; j < size_; ++j)
      {
    	  sum += data_[j];  //Loops through each element in array and sums them up
      }
      if (size_ == 0) //checks for division by zero
      {
    	  std::cout << "Cannot divide by zero!" << std::endl;
    	  return 0;
      }
      float mean = sum/size_; //calulates mean
      return mean;
    }
    
    template <typename T>
    double TStats<T>::Median()
    {
      if (sorted_ != 1) Sort();
    
      if(size_ % 2 == 1)
          return data_[(size_ - 1) / 2];   
      else 
          return (data_[size_ / 2 - 1] + data_[size_ / 2]) / 2.0;
    }
    
    template <typename T>
    void TStats<T>::Sort()
    {
    	for (size_t t = 0; t < size_; ++t) //This block compares two elements at a time to see which one is less than the other
      {
        int r = t;
        int h = 0;
          for (h = t; h < (int)size_; ++h)
          {
            if (data_[h] < data_[r])
            {
              r = h;
            }
          }
      Swap(data_[r],data_[t]);
      }
    	sorted_ = 1;
    }
    
    template <typename T>
    size_t TStats<T>::Size() const
    {
    	return size_; //size of array
    }
    
    template <typename T>
    void TStats<T>::SetData(const TStats<T>* data, size_t size)
    {
      size_ = size;
      data_ = new int [size_];
      for (size_t j = 0; j < size_; ++j)
      {
        data_[j] = data[j]; // loops through data elements and stores them to data_ elements
      }
    
      sorted_ = 0; //array not sorted
    }
    
    template <typename T>
    void TStats<T>::RetrieveData ( TStats<T> * data) const
    {
      for (size_t j = 0; j < size_; ++j)
      {
        data[j] = data_[j];
      }	
    }
    
    template <typename T>
    void TStats<T>::Swap(TStats<T>& x, TStats<T>& y)
    {
      int temp = x; //This block swaps the elements into ascending order
      x = y;
      y = temp; 
    }
    
    
    
    #endif
    Last edited by Frinavale; Dec 8 '09, 09:49 PM. Reason: Please post code in [code] ... [/code] tags. Added code tags.
  • RRick
    Recognized Expert Contributor
    • Feb 2007
    • 463

    #2
    What seems to be the problem?

    Your operator= for TStats seems odd. It looks like it is defined for T rather than TStats.

    Comment

    • randysimes
      New Member
      • Oct 2009
      • 54

      #3
      I have some of it figured out, but I am getting these errors now:
      ./tstats.h: In member function `void TStats<T>::SetD ata(const T*, T) [with T = NumberType]':
      ./tstats.h:96: instantiated from `void ReadData(TStats <T>&) [with T = NumberType]'
      test1.cpp:62: instantiated from here
      ./tstats.h:169: error: invalid conversion from `NumberType*' to `NumberType'
      ./tstats.h:172: error: invalid types `NumberType[NumberType]' for array subscript
      Here is the code:


      Code:
      #include <iostream>
      #include <cstdlib>
      #include <iostream>
      
      #ifndef _TSTATS_H
      #define _TSTATS_H
      
      //template <typename TStats>;
      
      const size_t max = 100; //Array max
      
      template <typename T>
      class TStats
      {
      public:
      
        TStats  () ;
        ~TStats () ;
        TStats  (const TStats<T>&) ;
      
        TStats<T>& operator =   (const T&) ;
      
        double Mean         () const ;
        double Median       () ;
        void Sort         () ;
      
        size_t Size         () const ;
        void   SetData      ( const T* data, T size ) ;
        void   RetrieveData ( T* data ) const ;
        
      private:
      
        unsigned int size_;
        T *  data_;
        bool   sorted_;
      
        static void  Swap   (T& x, T& y);
      };
      
      template <typename T>
      TStats<T>::TStats(): size_(0), data_(0), sorted_(0)
      {
        data_ = new T[max];
      }
      
      template <typename T>
      TStats<T>::~TStats()
      {
      	delete [] data_; //destructor
      }
      
      template <typename T>
      TStats<T>::TStats(const TStats<T>& a)
      {
      	data_ = new T [size_];
      	for (size_t i = 0; i < size_; ++i)
      		data_[i] = a.data_[i];
       
      }
      
      template <typename T>
      TStats<T>& TStats<T>::operator = (const T& s)
      {
        //delete [] data_; //deallocate data_
        T size_ = s.size_;
        T data_ = new T [size_];
        for (size_t i = 0; i < size_; ++i)
          T data_[i] = s.data_[i];
        return *this; //copies entered array into data_
      
      }
      
      template <typename T>
      void ReadData(TStats<T>&);
      
      template <typename T>
      void DisplayData(const TStats<T>&, std::ostream& os, char ofc = ' ');
      
      template <typename T>
      void ReadData(TStats<T>& s)
      {
        std::cout <<"Enter up to 100 integers seperated by spaces." << std::endl;
        std::cout << "Enter x and press enter to quit: ";
        
        
        T numbers[max]; //Intitializes array for integer entry to hold up to 100 integers
        size_t size = 0;
        
        while((std::cin >> numbers[size]) && (size < max)) //Allows for entry of all numbers at one
          size++;
        (s.SetData(numbers, size)); 
      }
      
      template <typename T>
      void DisplayData(TStats<T> const& s, std::ostream& os, char ofc)
      {
        T data [s.Size()];
        s.RetrieveData(data);
        for(size_t i = 0; i < s.Size(); ++i)
        {
      	  os << data[i] << ofc; //Displays each element of array seperated by a space
        }
        std::cout << std::endl;
      
      }
      
      template <typename T>
      double TStats<T>::Mean() const
      {
        T sum = 0; 
        for (size_t j = 0; j < size_; ++j)
        {
      	  sum += data_[j];  //Loops through each element in array and sums them up
        }
        if (size_ == 0) //checks for division by zero
        {
      	  std::cout << "Cannot divide by zero!" << std::endl;
      	  return 0;
        }
        T mean = sum/size_; //calulates mean
        return mean;
      }
      
      template <typename T>
      double TStats<T>::Median()
      {
        if (sorted_ != 1) Sort();
      
        if(size_ % 2 == 1)
            return data_[(size_ - 1) / 2];   
        else 
            return (data_[size_ / 2 - 1] + data_[size_ / 2]) / 2.0;
      }
      
      template <typename T>
      void TStats<T>::Sort()
      {
      	for (size_t t = 0; t < size_; ++t) //This block compares two elements at a time to see which one is less than the other
        {
          T r = t;
          T h = 0;
            for (h = t; h < (int)size_; ++h)
            {
              if (data_[h] < data_[r])
              {
                r = h;
              }
            }
        Swap(data_[r],data_[t]);
        }
      	sorted_ = 1;
      }
      
      template <typename T>
      size_t TStats<T>::Size() const
      {
      	return size_; //size of array
      }
      
      template <typename T>
      void TStats<T>::SetData(const T* data, T size)
      {
        T size_ = size;
        T data_ = new T [size_];
        for (T j = 0; j < size_; ++j)
        {
          data_[j] = data[j]; // loops through data elements and stores them to data_ elements
        }
      
        //T sorted_ = 0; //array not sorted
      }
      
      template <typename T>
      void TStats<T>::RetrieveData ( T * data) const
      {
        for (size_t j = 0; j < size_; ++j)
        {
          data[j] = data_[j];
        }	
      }
      
      template <typename T>
      void TStats<T>::Swap(T& x, T& y)
      {
        int temp = x; //This block swaps the elements into ascending order
        x = y;
        y = temp; 
      }
      
      
      
      #endif

      Comment

      • randysimes
        New Member
        • Oct 2009
        • 54

        #4
        Also, how do I get the number line setup like above?

        Comment

        • Banfa
          Recognized Expert Expert
          • Feb 2006
          • 9067

          #5
          You put [code] ... [/code] around the code you are posting.

          Comment

          • Banfa
            Recognized Expert Expert
            • Feb 2006
            • 9067

            #6
            You are missing a * on line 164 of the posted code.

            Comment

            Working...