CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 6 of 6
  1. #1
    Join Date
    Jun 2012
    Posts
    1

    C++ Standard to Template Class

    Hey everyone I am having trouble understanding proper syntax for template class, I am trying to convert a regular class to template class but am at a dead end. I am trying to take it one part at a time, the first is the declaration in main.cpp, FiniteClass<int> s1(5); returns linker errors when I attempt to compile. The declarration in finite.h FiniteStack(int size); and in FiniteStack.cpp FiniteClass::FiniteClass<C>(int size); are what correspond with each other.

    finitestack.h

    Code:
    #ifndef FINITESTACK_H
    #define FINITESTACK_H
    
    //class  IntFiniteStack {
    template <class C> 
    class FiniteStack {
      private:
       // int* items;
    	 C* items; 
       // int size; // array size (capacity of stack)
    	 int size; 
        //int top;
    	 int  top; 
      public:
        class StackEmptyException{ }; // empty inner class for exception handling
        class StackFullException{ }; // empty inner class for exception handling
        //IntFiniteStack();
    	FiniteStack();
        //IntFiniteStack(int size);
    	FiniteStack(int size); 
        virtual ~FiniteStack();
        void push(int) ;
        int pop();
        bool isEmpty();
        bool isFull();
    };
    
    #endif
    finitestack.cpp

    Code:
    #include "FiniteStack.h"
    template <class C>
    FiniteStack<C>::FiniteStack() {
      top = 0;
      size = 10;
      items = new int[10]; //default size
    }
    template <class C> 
    FiniteStack<C>::FiniteStack(int size) {
      top = 0;
      this->size = size;
      items = new int[size];
    }
    
    // destructor: free all the memory allocated for the stack
    template <class C> 
    FiniteStack<C>::~FiniteStack() {
      delete [] items;
    }
    
    // push a data onto the stack
    template <class C>
    void FiniteStack<C>::push(int data) {
      if (isFull())
        throw StackFullException();
      items[top] = data;
      top++; // to combine two lines ==> items[top++] = data
    }
    
    // pop the data from the stack
    template <class C>
    int FiniteStack<C>::pop() {
      if (isEmpty())
        throw StackEmptyException();
      --top;
      return items[top]; // to combine two lines ==> return items[--top];
    }
    
    // is stack empty?
    template <class C> 
    bool FiniteStack<C>::isEmpty() {
      if (top == 0) return true;
      else return false;
    }
    
    // is stack full?
    template <class C> 
    bool FiniteStack<C>::isFull() {
      if (top == size) return true;
      else return false;
    }
    main.cpp

    Code:
    #include <iostream>
    using namespace std;
    
    #include "FiniteStack.h"
    
    int main() {
    	FiniteStack<int> s1(5);
      //FiniteStack<int> s1(5);
     /*
      // Stack empty test
      if (s1.isEmpty()) {
          cout << "s1 is empty at the beginning." << endl;
      } else {
          cout << "s1 must be empty. Something's wrong!" << endl;
      }
      
        s1.push(1);
        s1.push(2);	
        s1.push(3);
        s1.push(4);
        s1.push(5);
      
      // Stack full test
      if (s1.isFull()) {
          cout << "s1 is full after five push() calls." << endl;
      } else {
          cout << "s1 must be full. Something's wrong!" << endl;
      }
      
      // pop() test: reverses the items
      cout << "Expected: 5 4 3 2 1 -->" << endl;
      for (int i = 0; i < 5; i++) {
          cout << s1.pop() << endl;
      }
      
      // Stack empty test
      if (s1.isEmpty()) {
          cout << "s1 is empty after five pop() calls." << endl;
      } else {
          cout << "s1 must be full. Something's wrong!" << endl;
      }
    
      // StackFullException test
      cout << "Expected: StackFullException --> ";
      try {
        s1.push(1);
        s1.push(2);
        s1.push(3);
        s1.push(4);
        s1.push(5);
        s1.push(6);
      } catch (FiniteStack::StackEmptyException) {
        cout << "Exception: cannot pop, stack is empty" << endl;
      } catch (FiniteStack<StackFullException>) {
        cout << "Exception: cannot push, stack is full" << endl;
      }
      
      // StackEmptyException test
      cout << "Expected: StackEmptyException --> ";
      try {
        s1.pop(); s1.pop(); s1.pop(); s1.pop(); s1.pop(); s1.pop();
    
      } catch (FiniteStack::StackEmptyException) {
        cout << "Exception: cannot pop, stack is empty" << endl;
      } catch (FiniteStack<C>::StackFullException) {
        cout << "Exception: cannot push, stack is full" << endl;
      }*/
      
      return 0;
    
    }

  2. #2
    Join Date
    Jul 2005
    Location
    Netherlands
    Posts
    2,042

    Re: C++ Standard to Template Class

    C++ FAQ Lite 35.7. Why can't I separate the definition of my templates class from it's declaration and put it inside a .cpp file?

    Also:
    - You should put a "using namespace" declaration below all includes, otherwise it can cause name conflicts in the included files.
    - You should derive you exceptions from std::exception, such that they can be caught by someone who doesn't know your code.
    - Your class is not const-correct. Member functions such as isEmpty and isFull should be const.
    Last edited by D_Drmmr; July 2nd, 2012 at 03:59 AM.
    Cheers, D Drmmr

    Please put [code][/code] tags around your code to preserve indentation and make it more readable.

    As long as man ascribes to himself what is merely a posibility, he will not work for the attainment of it. - P. D. Ouspensky

  3. #3
    Join Date
    Apr 1999
    Posts
    27,449

    Re: C++ Standard to Template Class

    Also, your template class cannot be copied safely.
    Code:
    int main()
    {
        FiniteStack<int> s1;
        FiniteStack<int> s2 = s1;
        FiniteStack<int> s3;
        s3 = s1;
    }
    This simple program creates a memory leak and a double free error when the program exits -- even if you got your original code to compile and work for your main() function, the main() function I wrote above breaks everything.

    Your class lacks a user-defined copy constructor and assignment operator to handle the dynamically allocated memory properly when making copies.

    If the class cannot be copied, then you must make the copy constructor and assignment operator private functions, and both without implementations.

    Regards,

    Paul McKenzie
    Last edited by Paul McKenzie; July 2nd, 2012 at 02:36 PM.

  4. #4
    Join Date
    Jun 2009
    Location
    France
    Posts
    2,513

    Re: C++ Standard to Template Class

    Quote Originally Posted by D_Drmmr View Post
    Also:
    - You should put a "using namespace" declaration below all includes, otherwise it can cause name conflicts in the included files.
    I'll just add that this, of course, is when you are inside a .cpp.

    "using namespace" has no place anywhere in a .h file.
    Is your question related to IO?
    Read this C++ FAQ article at parashift by Marshall Cline. In particular points 1-6.
    It will explain how to correctly deal with IO, how to validate input, and why you shouldn't count on "while(!in.eof())". And it always makes for excellent reading.

  5. #5
    Join Date
    Jan 2004
    Location
    Düsseldorf, Germany
    Posts
    2,401

    Re: C++ Standard to Template Class

    Code:
        void push(int) 
    int pop();
    Why "int" if you want to push/pop objects of class C?
    More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity. --W.A.Wulf

    Premature optimization is the root of all evil --Donald E. Knuth


    Please read Information on posting before posting, especially the info on using [code] tags.

  6. #6
    Lindley is offline Elite Member Power Poster
    Join Date
    Oct 2007
    Location
    Seattle, WA
    Posts
    10,895

    Re: C++ Standard to Template Class

    Quote Originally Posted by monarch_dodra View Post
    I'll just add that this, of course, is when you are inside a .cpp.

    "using namespace" has no place anywhere in a .h file.
    Not entirely true. It's fine so long as it's used in a restricted scope.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured