Форум программистов, компьютерный форум CyberForum.ru

Templates (composition). exception handling run-time error - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 14:46     Templates (composition). exception handling run-time error #1
Код компилируется.
Если делать циклы для push and pop размера такого чтоб не превышало размеры Стока то все работает нормально
если циклы больше размера стока то выходит вот такая картинка в консоле (см. принт скрин )
Заранее спасибо.

Array_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//                                                      
//                                                  (---.Array_hpp---)
//
#ifndef Array_HPP   // Preprocessor gates
#define Array_HPP
 
    #include <sstream>
    #include <iostream>
    #include <exception>
 
    template <class Type>   //Remove the "=double" default parameter.
    class Array
        {
    
            protected:                  // Declaration of private data members 
              unsigned int m_size;
              Type*        m_data;      //m_data should be a pointer, since you want to allocate data to it
 
            public:                     // Public declaration of data members (in given example haven't ) and member functions 
              static int m_size_default;
 
                //----------- Declaration of Constructors -----------//
              Array();                                  // Default constructor
              Array(const unsigned int new_size);       // Constructor 
              Array(const Array<Type>& ObjArray);       // Copy constructor
              ~Array();                                 // Destructor
 
              //----------- Declaration of  Accessors member functions -----------//
              Type& GetElement(const unsigned int index) const;
              static int  DefaultSize() ;
              int Size() const;
 
              //----------- Declaration of Modificator(s) member functions -----------//
              void Swap(Array& ObjArray);  
              void SetElement(const Type& ObjType, const unsigned int index);
              static void DefaultSize( int newSize) ;
 
              //----------- Declaration of Operators Overloading the class's members -----------//
              Array<Type>& operator =   (const Array& ObjArray);                //Const correctness here.
              const Type& operator  []  (unsigned int index) const;
              Type& operator        []  (unsigned int index);           
        };
 
// /*
    #ifndef Array_cpp // Must be the same name as in source file #define
 
        #include "Array.cpp"
 
    #endif //#ifndef Array_cpp is CLOSED
// */
 
//  #include "Array.inl"
 
#endif //  #ifndef Array_HPP is CLOSED


ArrayException_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//                                                      
//                                                  (---.ArrayException_hpp---)
//
#ifndef ArrayException_HPP
#define ArrayException_HPP
 
#include <iostream>
#include <string>
using namespace std;
 
class ArrayException 
{
protected: 
 
public : 
    ArrayException () {};
    virtual std::string GetMessage() const = 0;
};  
 
class OutOfBoundsException : public ArrayException
{
private : 
     int m_index;
public : 
    OutOfBoundsException();
    OutOfBoundsException(int current_index) : m_index( current_index) {} 
    std::string GetMessage() const
        
    {
 
    std::ostringstream os;                          // std::stringstream object
                os  << "\nEXCEPTION HANDLING ERROR: "
                    << "the given element " 
                    << "with index : " 
                    << m_index 
                    << " is out of bounds\n "   ;
                return os.str();    
    }
 
};
#endif // ArrayException_H


Point_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//                                                      
//                                                  (---.Point_hpp---)
//  
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
// Lib(s)
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <cmath>
 
    class Point 
        {   
            private:        // Declaration of private data members 
            double x;       // X coordinate
            double y;       // Y coordinate
 
            public: // Public declaration of data members (in given example haven't ) and member functions 
 
 
                //----------- Declaration of Constructors -----------//
            Point();                                                // Default constructor
            Point(const double newX ,const double newY) ;           // Constructor 
            explicit Point(const double value );                    // Second Constructor 
            Point (const Point& ObjectOfClassPoint);                // Copy constructor
            ~Point();                                               // Destructor
 
 
            //----------- Declaration of  Accessors member functions -----------//
            std::string ToString() const;    
            double X() const;                   
            double Y() const;   
            ///*virtual*/ void Draw() const { std::cout << "This's  Point from Draw()\n"; }
 
 
            //----------- Declaration and  of and Implementaion of setters member functions -----------//
            void X(const double newX) {x = newX;};  // The x-coordinate
            void Y(const double newY) {y = newY;};  // The y-coordinate
 
 
            //----------- Declaration of Calculators (additional functionality) member functions -----------//
            double Distance() const;
            double Distance(  const Point  & ObjPoint ) const;
 
 
            //----------- Declaration of Operators Overloading the class's members -----------//
            Point  operator -  () const;                                    // Negate the coordinates.
            Point  operator *  (double factor) const;                       // Scale the coordinates.
            Point  operator +  (const Point& ObjPoint) const;               // Add coordinates.
            bool   operator == (const Point& ObjPoint) const;               // Equally compare operator.
            Point& operator =  (const Point& ObjPoint);                 // Assignment operator.
            Point& operator *= (double factor );                        // Scale the coordinates & assign.
            Point& operator += (const Point& ObjPoint);
            Point& operator -= (const Point& ObjPoint);
 
 
            //----------- Declaration of Global Ostream << Operator  -----------//
            friend std::ostream& operator << (std::ostream& out,const Point & ObjPoint); 
    
        };
 
    //----------- Implementaion (inline) of getters member functions -----------//
    // Given functions should be const because we not willing modify contained variables when we call those fucntions in any case
    inline  double Point::X() const {return x;};                    
    inline  double Point::Y() const {return y;};    
 
 
#endif // Point_HPP


Stack_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//                                                      
//                                                  (---.Stack_hpp---)
//  
#ifndef STACK_HPP
#define STACK_HPP
 
    #include    "Array.hpp"
 
    template<class Type>
    class Stack
        {
            private:
 
                int m_current;
                Array<Type>* m_array;
 
            public:
 
                //----------- Declaration of Constructors -----------//
                Stack();                            // Default (Nullary ) Construcotr
                Stack(int size);                    // Non-nullary Constructor 
                Stack(const Stack<Type>& copy);     // Copy Constructor
                ~Stack();                           // Destructor
    
                //----------- Declaration of  Accessors member functions -----------//
                int Current() const;
 
                //----------- Declaration of Modificator(s) member functions -----------//
                void Push(const Type& add);                                 // Add a new element to the array
                Type& Pop();                                                    // Remove the last element of the array
   
                //----------- Declaration of Operators Overloading the class's members -----------//
                Stack<Type>& operator = (const Stack<Type>& ObjStack);      //assignment operator
        };
 
    #ifndef STACK_CPP 
 
        #include"Stack.cpp"
 
    #endif // STACK_CPP is CLOSED
 
#endif // // STACK_HPP is CLOSED


Array_CPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//                                                      
//                                                  (---.Array_CPP---)
//  
//  /*
#ifndef Array_CPP   // Preprocessor gates
#define Array_CPP
// */
        #include "Array.hpp"
        
    template <class Type>
    int Array<Type>::m_size_default = 10;
 
    //----------- Implementation of Constructors -----------//
        template <class Type>
        Array<Type>::Array() : m_size(10), m_data(0)
            { 
 
            }
 
        template <class Type>
        Array<Type>::Array(unsigned int new_size) 
            : m_size(new_size), m_data(new Type[new_size])
            { 
 
            }
 
        template <class Type>
        Array<Type>::Array(const Array& ObjArray) : m_data(0), m_size(0)
            {
                
              if(!ObjArray.m_data) {return;}
 
              Array tmp;                // Copy construct into another temporary array, 
                                        // this way, if something throws, tmp will clean itself up.
 
              //Create the array
              tmp.m_data = new Type[ObjArray.m_size];
              tmp.m_size = ObjArray.m_size;
 
              //Copy the array elements
              for(unsigned int i = 0; i < tmp.m_size; ++i)
                {tmp.m_data[i] = ObjArray.m_data[i];}
 
              //All done! swap into this!
              this->Swap(tmp);
            }
 
 
        template <class Type>
        Array<Type>::~Array()
            {
              //Technically, the if is not necessary
              if(m_data)
                  {
                    delete[] m_data;
                    m_data = 0;
                  }
 
              //Not necessary either, but just to be clean
              m_size = 0;
            }
 
        //----------- Implementation of Accessor(s) member functions -----------//
 
        template <class Type> 
        Type& Array<Type>::GetElement(const unsigned int index) const
            
                {   
                    std::cout << "GetElement -> " ;
                    if (index > m_size || index < 0)  
                        { 
                            throw OutOfBoundsException(index);
                        }
                return m_data[index];
                
                }
 
        template <typename Type>
        int Array<Type>::DefaultSize() 
            { 
                return m_size_default;
            }
 
        template<class Type>
        int Array<Type>::Size() const
            {
                return this->m_size; 
            }
 
        
        //----------- Implementaion of Modificator(s) member(s) function -----------//
 
        template <class Type>
        void Array<Type>::Swap(Array& ObjArray)
            {
                //std::swap()  - try to implement std swap function 
              Type* data = m_data;
       unsigned int size = m_size;
              m_data     = ObjArray.m_data;
              m_size     = ObjArray.m_size;
         ObjArray.m_data = data;
         ObjArray.m_size = size;
            }
 
        template <class Type> 
        void Array<Type>::SetElement(const Type& ObjType,unsigned int index)
            {   // When the index is out of bounds, ignore the “set”.
                if (index > m_size || index < 0)  
                    {
                        throw OutOfBoundsException(index);
                    }   
 
                m_data[index] = ObjType;
                std::cout 
                    << "Set Element <- " 
                    << ObjType  
                    << std::endl;
            }
 
        template <typename Type>
        void Array<Type>::DefaultSize( int newSize) 
            { 
                m_size_default = newSize; 
            }
 
        //----------- Implementation of Operators Overloading the class's member -----------//
 
        template <class Type>
        Array<Type>& Array<Type>::operator = (const Array& ObjArray)
            {
              //Check self assign:
              if(this == &ObjArray) {return *this;}
 
              Array<Type> copy(ObjArray);   //Create a copy of ObjArray; If this fails, then *this will not be changed, and nothing will leak
 
                                            //Succeeded creating copy. Now we can put it inside this
              this->Swap(copy);             //And then swap the copy into this!
 
              return *this;
            }
 
        template <class Type> 
        Type& Array<Type>::operator [] (unsigned int index) 
            {
            //  cout << "Array [] operator" << endl;
 
                if (index >= this->m_size)
                {
                //  cout << "i am hreeeee" << endl;
                    return this->m_data[0];
                }
                return m_data[index];
            }
 
        template <class Type> 
        const Type& Array<Type>::operator [] (unsigned int index) const
            {   
                if (index > this-> m_size)
                        {
                            std::cout 
                                << "OUT OF BOUND ";
                            return this->m_data[0];
                        }
                return m_data[index];
            }
 
 
// /*
#endif //Array_CPP
 
//      */


Point_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//                                                      
//                                                  (---.Point_cpp---)
//  
    #include "Point.hpp"
 
 int number_of_point_constructor_calls          = 1 ;   
 int number_of_point_destructor_calls           = 1 ;  
 int number_of_point_assignment_operator_calls  = 1 ; 
 
 
                //----------- Implementation of Constructors -----------//
    Point::Point() : x(0) , y(0)            // Default constructor (implemented using colon syntax )                                    
            { 
            //  std::cout << "hi my default constructor\n\n\t";
            }                           
 
 
    Point::Point(const double newX ,const double newY) : x(newX)  , y(newY)     // Constructor 
            { 
        //      std::cout << " My Point constructor was called " << number_of_point_constructor_calls++ << " times " << "\n"; 
            }                   
 
    Point::Point(const double value ) : x(value)                // Second Constructor 
            { 
            //std::cout << "hi my constructor\n\n\t"; 
            }   
    Point::~Point()                                             // Destructor
            {
            //  std::cout << " My Point destructor was called " << number_of_point_destructor_calls++ << " times " << "\n"; 
            }                                    
 
    Point::Point (const Point& ObjectOfClassPoint)              // Copy constructor
            {
                //std::cout << "this is COPY constructor\n\n\t ";
                x = ObjectOfClassPoint.x;
                y = ObjectOfClassPoint.y;
            }
        
 
                //----------- Implementation of Accessor(s) member functions -----------//
    std::string Point::ToString() const
            {
            //  std::string s=Shape::ToString();                                
                std::ostringstream os;                          // std::stringstream object
                os << " Point (" << x << ", " << y << ") " ;    // customization of output and calling base class functuanality 
                return os.str();                                // str() function retrieve the string from the string buffer
            }
 
 
                //----------- Implementation of Calculators (additional functionality) member functions -----------//
    double  Point::Distance() const
 
            {
                return std::sqrt(pow(x,2) + pow(y,2));
            }
 
 
    double  Point::Distance(const Point   &ObjPt ) const
    
            {
                return std::sqrt(pow((x-ObjPt.x),2) + pow(y - ObjPt.y,2)); 
            }
 
 
            //----------- Implementation of Operators Overloading the class's member -----------//
    Point Point::operator  -  () const                                  // Negate the coordinates.          
        {
            return Point(-x,-y);
        }
 
    Point Point::operator  *  (double factor) const                     // Scale the coordinates.
        {
            return Point(x * factor, y * factor);
        }
 
    Point Point::operator  +  (const Point& ObjPoint) const             // Add coordinates.
        { 
            return Point(x + ObjPoint.x, y + ObjPoint.y);
        }
 
    bool Point::operator   == (const Point& ObjPoint) const             // Equally compare operator.    
        {
            return (x==ObjPoint.x)&(y==ObjPoint.y);
        }
 
    Point& Point::operator =  (const Point& ObjPoint)                           // Assignment operator.             
                {       
            //      std::cout << " My Point assignment operator was called " << number_of_point_assignment_operator_calls++ << " times " << "\n"; 
                    x=ObjPoint.x, y=ObjPoint.y;
                    return *this;                                               // The meaning of *this explained in this example (implementation) see comment out  
                }
 
    Point& Point::operator *= (double factor)                                   // Scale the coordinates & assign.      
        {
            x *= factor; 
            y *= factor;
 
            return *this ; 
        }
    
 
    Point& Point::operator += (const Point& ObjPoint)  
        {
                x += ObjPoint.x;
                y += ObjPoint.y;
 
                return *this;
        }
 
    Point& Point::operator -= (const Point& ObjPoint)
        {
                x -= ObjPoint.x;
                y -= ObjPoint.y;
 
                return *this;
        }
 
 
    //----------- Implementation of GLOBAL Ostream << Operator  -----------//
    std::ostream& operator << (std::ostream& out,const Point & ObjPoint)
            {
                return out << "[" << ObjPoint.x << "," << ObjPoint.y << "]" ; 
                
            }


Stack_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//                                                      
//                                                  (---.Stack_cpp---)
//  
#ifndef STACK_CPP
#define STACK_CPP
 
    #include "Stack.hpp"
    
    
        
    //----------- Implementation of Constructors -----------//
    template<class Type>                            
    Stack<Type>::Stack()                                        // Default constructor
        :m_array(new Array<Type>()),m_current(0) 
        {   //the current position is the last index of the Array
            
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(int size)                    
        :m_array(new Array<Type>(size)),m_current(0)       
        {   //the current position is the last index of the Array
 
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(const Stack<Type>& copy)                 // Copy constructor
        :m_array(copy.m_array),m_current(m_array.Size()-1) 
            {   //the current position is the last index of the Array copied
 
            }
 
    template<class Type>
    Stack<Type>::~Stack()                                       // Destructor
        {
 
        }
 
    //----------- Implementation of Accessor(s) member functions -----------//
    template<class Type>
    int Stack<Type>::Current() const
        {
            return(m_current);
        }
 
 
    //----------- Implementaion of Modificator(s) member(s) function -----------//
    template<class Type>
    void Stack<Type>::Push(const Type& element)
        {
            
// IDEA_ m_array.Array<Type>::operator[](m_current)=element; this is an other 
// implementation of setting element on current possition 
                //  try   {
                             m_array->SetElement(element,++m_current);
                    
                //        }
        /*
                        catch( ArrayException& arr_exception)
                                {
                                      std::cout << "Exception: " << arr_exception.GetMessage() << std::endl;
                                      std::cout << "Caution: stack is empty, the value pop-out is not correct." << std::endl;
                                      return m_array->SetElement(element,--m_current); 
                                      // set back the current position to previous position (0) when stack is empty
                                      // and return the value stored in the array [0]
                                }
        */  
        }
 
    template<class Type>
    Type& Stack<Type>::Pop()
        {
            // IDEA_ problem can occure because return putted before --m_currect check it   
 
            //  --m_current;
 
        //  try {
                return m_array->GetElement(--m_current); 
        //      }
                                /*
                catch( ArrayException& arr_exception)
                                {
                                      std::cout << "Exception: " << arr_exception.GetMessage() << std::endl;
                                      std::cout << "Caution: stack is empty, the value pop-out is not correct." << std::endl;
                                      return m_array->GetElement(++m_current); 
                                      // set back the current position to previous position (0) when stack is empty
                                      // and return the value stored in the array [0]
                                }
                                */
        }
 
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    template<class Type>
    Stack<Type>& Stack<Type>::operator=(const Stack<Type>& s)   // Asignment operator
        {
            if(this!=&s)        //handle self assignment
            {
                this->Stack<Type>::operator=(s);
                m_current = s.m_current;
            }
 
            return(*this);
        }
 
#endif


main_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//                                                      
//                                                  (---.main_cpp---)
//
//      Lib(s)
        #include <iostream>
//      #include <exception>
 
//      Header(s)
        #include "Point.hpp"
        #include "Array.cpp"
        #include "Stack.cpp"
        #include "ArrayException.hpp"
 
        using namespace std;
int main()
{
 
    //!!!!!!Make sure the current index is not changed when the Array class throws an exception.!!!!!!
    
 
    
    const unsigned int size_of_data_array = 10; 
 
    double data_x[size_of_data_array] 
                =   {1830 , 190.1 , 1914 , 1900 , 1839  , 
                     1865 , 1914  , 1633 , 1656 , 18.95 } ; 
 
    double data_y[size_of_data_array] 
                = { 1903 , 1834 , 1812 , 1088 , 1789, 
                   19.47 , 1211 , 1969 , 1535 , 1628   } ; 
 
     
    // Creating an array of Point pointers 
    // with size_of_array elements on the heap.
    Point** MyArrayOfPointers = new Point*[size_of_data_array];         
        
   
    for (unsigned int i = 0 ; i <size_of_data_array; i++ )                      
        { 
    // Create for each element in the array a point on the heap.
            MyArrayOfPointers[i] = new Point(data_x[i],data_y[i]);                                                                                      
        }
 
    const unsigned int size_of_stack = 5; 
    const unsigned int too_big_index = size_of_data_array;
    const unsigned int index_of_loop = too_big_index; 
 
 
    Stack<Point> s(size_of_stack);
 
    
    std::cout << " size_of_the Stack is: " << size_of_stack << "\n";
    std::cout << "  Point data array is: " << size_of_data_array << "\n";
    std::cout << "   Index of loops are: " << index_of_loop << "\n";
    
 
    cout << "TEST  of push() end " << endl;
    cout << "current possition is BEFORE pushing : " << s.Current() << endl;
 
 
for(int i = 0;i<index_of_loop;++i)
    {
        try {
         s.Push(*MyArrayOfPointers[i]); // 
            }
 
    //  /* 
 
        catch ( ArrayException& objArrayException )
                 {
                    std::cout << objArrayException.GetMessage() ;
                 }  
 
    //  */
    }
 
cout << "TEST of pop() end " << endl;
    cout << "current possition is AFTER pushing : " << s.Current() << endl;
 
for(int i = 0; i<index_of_loop;++i)
    {
        try {
            std::cout << " index : "    << s.Current() 
                      << "  element : " << s.Pop()<<endl;
            }
 
    //  /*
    catch ( ArrayException& objArrayException )
                 {
                    std::cout << objArrayException.GetMessage() ;
                 }   
 
//               */
    }
 
    cout << endl;
    return 0;
}
Миниатюры
Templates (composition). exception handling run-time error  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2012, 14:46     Templates (composition). exception handling run-time error
Посмотрите здесь:

Run-Time Check Failure #3 C++
C++ Run-Time Check Failure #3
C++ Полином Лежандра первого рода. Run-Time error =(
C++ Run-time error
C++ Создание, заполнение объектами и удаление динамического массива. Выдает run time error
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 15:07     Templates (composition). exception handling run-time error #2

Не по теме:

Сразу насчёт ArrayException: есть же std::range_exception.


Во-первых, я что-то не увидел автоматического изменения размеров Array а-ля std::vector. Ну да ладно, это исключениями должно было перехватиться.

Я думаю, проблема вот в этом:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class Type>
    void Stack<Type>::Push(const Type& element)
        {
            m_array->SetElement(element,++m_current);
        }
 
template<class Type>
    Type& Stack<Type>::Pop()
        {
            return m_array->GetElement(--m_current); 
        }
У вас изначально при создании стека m_current == 0. По идее это верхушка стека. Если вы кладёте что-то в стек, то вы кладёте его на верхушку. То есть в ячейку с индексом 0. А вы его увеличиваете на единицу и получается, что кладёте в array[1]. Потому и вылетает при попытке положить пятый элемент массива (стек на пять элементов, четыре заняты, нулевой пустует).

Перепишите функции вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class Type>
    void Stack<Type>::Push(const Type& element)
        {
            m_array->SetElement(element,m_current);
            ++m_current;
        }
 
template<class Type>
    Type Stack<Type>::Pop()
        {
            Type result = m_array->GetElement(m_current - 1); 
            --m_current;
            return result;
        }
(Угу, и в хедере тоже поправьте прототип Pop. Если мы что-то достали из стека, то этого чего-то там уже нет. Нельзя возвращать ссылку.)

Это ещё раз подтверждает правило: явное лучше неявного.

Не по теме:

И это... где в Pop проверка на то, что стек не пуст? Это ведь проблема стека, а не нижележащего Array.

Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 15:21  [ТС]     Templates (composition). exception handling run-time error #3
Та же самая ошибка на том же месте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class Type>
    void Stack<Type>::Push(const Type& element)
        {
            
 
                             m_array->SetElement(element,m_current);
                                ++m_current;
 
        }
 
    template<class Type>
    Type Stack<Type>::Pop()
        {
    
            
            Type    result = m_array->GetElement(m_current - 1); 
                --m_current;
                return result;
 
        }
Добавлено через 8 минут
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
[OFF]

Не по теме:

И это... где в Pop проверка на то, что стек не пуст? Это ведь проблема стека, а не нижележащего Array.

Спасибо что напомнили кстати но это потом мне бы пока с этим разобраться
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 15:44     Templates (composition). exception handling run-time error #4
Ах да, ещё. Array.cpp, строка 110, ошибка на единицу: index >= m_size (а не просто больше, индекс m_size уже за пределами дозволенного).

Кроме этого что-то не вижу, чего оно там должно падать. Придётся компилировать у себя. Да и вам бы не помешало взять отладчик и искать.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 15:57  [ТС]     Templates (composition). exception handling run-time error #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ах да, ещё. Array.cpp, строка 110, ошибка на единицу: index >= m_size (а не просто больше, индекс m_size уже за пределами дозволенного).

Кроме этого что-то не вижу, чего оно там должно падать. Придётся компилировать у себя. Да и вам бы не помешало взять отладчик и искать.
подскажите какой ниб видео с ютуба или статью как научиться дебагить за 10 минут я уже закалибался от отсутствие этого навыка

УРРРАРААРАРРАР все круто работает !!!! СПАСИБО ОГРОМНОЕ !!!

Добавлено через 9 минут
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
И это... где в Pop проверка на то, что стек не пуст? Это ведь проблема стека, а не нижележащего Array.[/OFF]
А как это по нормальному сделать ??? если в трех словах
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 16:07     Templates (composition). exception handling run-time error #6
Цитата Сообщение от Leeto Посмотреть сообщение
подскажите какой ниб видео с ютуба или статью как научиться дебагить за 10 минут я уже закалибался от отсутствие этого навыка
В данном случае более полезной оказывается внимательность. От хромающей внимательности немного помогают юнит-тесты, но и там надо ж не забыть протестировать попытки обращения к элементам с индексами –1, <размер массива>, <размер массива + 1> и так далее.

Цитата Сообщение от Leeto Посмотреть сообщение
А как это по нормальному сделать ??? если в трех словах
Ну как, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class Type>
    Type Stack<Type>::Pop()
        {
            if (m_current == 0)
                {
                    throw /*какой-нибудь*/ InvalidStateException();
                }
            Type result = m_array->GetElement(m_current - 1); 
            --m_current;
            return result;
        }
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 16:51  [ТС]     Templates (composition). exception handling run-time error #7
Еще такой момент поскажи пожалуйста я не уверен правильно ли у меня дистрактора работают... я пытался в них сообщения писать но что то в консоли я ничего не увидел или их как то специально вызывать надо если до то где... типа как в гет элемент ??? или в мейне ???
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 18:04     Templates (composition). exception handling run-time error #8
Правильный вопрос. В стеке — нет. Вот удаляется элемент из стека. Но ведь на самом деле он там остался же, это только указатель верхушки сдвинулся. Так что надо вызвать для него деструктор, как только он удаляется из стека:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class Type>
    Type Stack<Type>::Pop()
        {
            if (m_current == 0)
                {
                    throw /*какой-нибудь*/ InvalidStateException();
                }
            Type result = m_array->GetElement(m_current - 1);
            m_array->GetElement(m_current - 1).~Type();
            --m_current;
            return result;
        }
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 19:48  [ТС]     Templates (composition). exception handling run-time error #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Правильный вопрос. В стеке — нет. Вот удаляется элемент из стека. Но ведь на самом деле он там остался же, это только указатель верхушки сдвинулся. Так что надо вызвать для него деструктор, как только он удаляется из стека:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class Type>
    Type Stack<Type>::Pop()
        {
            if (m_current == 0)
                {
                    throw /*какой-нибудь*/ InvalidStateException();
                }
            Type result = m_array->GetElement(m_current - 1);
            m_array->GetElement(m_current - 1).~Type();
            --m_current;
            return result;
        }
~Type(); вот это вообще что такое ???
вообще по моему m_array->GetElement(m_current - 1).~Type(); эта строчка не рабочая
когда я пишу GetElement(m_current - 1) и ставлю точку вижуал студия не предлагает мне ни каких вариантов
да и по смыслу не должно быть
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 19:56  [ТС]     Templates (composition). exception handling run-time error #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
В данном случае более полезной оказывается внимательность. От хромающей внимательности немного помогают юнит-тесты, но и там надо ж не забыть протестировать попытки обращения к элементам с индексами –1, <размер массива>, <размер массива + 1> и так далее.

Ну как, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class Type>
    Type Stack<Type>::Pop()
        {
            if (m_current == 0)
                {
                    throw /*какой-нибудь*/ InvalidStateException();
                }
            Type result = m_array->GetElement(m_current - 1); 
            --m_current;
            return result;
        }
У меня на самом деле есть еще одна сложность по заданию надо проверять после push and pop валидность индекса а он у меня получается левый немного
при этом в push and pop надо имплементировать так чтоб с одной стороны эксепшен с Array class перехватывал если что, а с другой стороны чтобы после того как все эксепшены прошли индекс оставался нормальный в пределах массива
короче проще на принт скрине показать

вообщем в тех местах где написано " should be 4 " и " should be 0 " он действительно должен быть такой
вот обновленный код с main.cpp and Stack.cpp больше ничего не менял


main_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//                                                      
//                                                  (---.main_cpp---)
//
//      Lib(s)
        #include <iostream>
 
//      Header(s)
        #include "Point.hpp"
        #include "Array.cpp"
        #include "Stack.cpp"
        #include "ArrayException.hpp"
 
        using namespace std;
int main()
{
 
    //!!!!!!Make sure the current index is not changed when the Array class throws an exception.!!!!!!
    
 
    
    const unsigned int size_of_data_array = 10; 
 
    double data_x[size_of_data_array] 
                =   {1830 , 190.1 , 1914 , 1900 , 1839  , 
                     1865 , 1914  , 1633 , 1656 , 18.95 } ; 
 
    double data_y[size_of_data_array] 
                = { 1903 , 1834 , 1812 , 1088 , 1789, 
                   19.47 , 1211 , 1969 , 1535 , 1628   } ; 
 
     
    // Creating an array of Point pointers 
    // with size_of_array elements on the heap.
    Point** MyArrayOfPointers = new Point*[size_of_data_array];         
        
   
    for (unsigned int i = 0 ; i <size_of_data_array; i++ )                      
        { 
    // Create for each element in the array a point on the heap.
            MyArrayOfPointers[i] = new Point(data_x[i],data_y[i]);                                                                                      
        }
 
    const unsigned int size_of_stack = 5; 
    const unsigned int too_big_index = size_of_stack + size_of_stack/2;
    const unsigned int index_of_loop = too_big_index; 
 
 
    Stack<Point> s(size_of_stack);
 
    
    std::cout << " Size of the Stack is:      " << size_of_stack << "\n";
    std::cout << "  Point data array is:      " << size_of_data_array << "\n";
    std::cout << "Index of loops for testing\nPush and Pop fucntions are: " << index_of_loop << "\n";
    
 
                                        cout << "\n\n\t\t --- TEST  of Push() function --- " << endl;
 
    cout << "current possition is BEFORE pushing : " << s.Current() << endl;
for(unsigned int i = 0;i<index_of_loop;i++)
    {
        try {
            std::cout << " index : "    << s.Current() << "  " ;
                      
         s.Push(*MyArrayOfPointers[i]); // 
            }
 
        catch ( ArrayException& objArrayException )
                 {
                    std::cout << objArrayException.GetMessage() ;
                 }  
    }
 
std::cout   << "\nLet's making sure the current index is not\nchanged when the Array class throws an exception." 
            << "\nSo currect index after a lot of incorrect usage of\nPush() function should be 4 let's see -> " 
            << s.Current() 
            << " This is correct index "; 
 
 
    
                                    cout << "\n\n\t\t --- TEST of Pop() function --- " << endl;
for(unsigned int i = 0; i<index_of_loop;i++)
    {
        try {
            std::cout << " index : "    << s.Current() 
                      << "  element : " << s.Pop()<<endl;
            }
 
    catch ( ArrayException& objArrayException )
                 {
                    std::cout << objArrayException.GetMessage() ;
                 }   
    }
 
std::cout   << "\nLet's making sure the current index is not\nchanged when the Array class throws an exception." 
            << "\nSo currect index after a lot of incorrect usage of\nPop() function should be 0 let's see -> " 
            << s.Current() 
            << " This is correct index "; 
 
    std::cout << "\n\n\n";
    cout << endl;
    return 0;
}



Stack_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//                                                      
//                                                  (---.Stack_cpp---)
//  
#ifndef STACK_CPP
#define STACK_CPP
 
    #include "Stack.hpp"
    
    
        
    //----------- Implementation of Constructors -----------//
    template<class Type>                            
    Stack<Type>::Stack()                                        // Default constructor
        :m_array(new Array<Type>()),m_current(0) 
        {   //the current position is the last index of the Array
            
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(int size)                    
        :m_array(new Array<Type>(size)),m_current(0)       
        {   //the current position is the last index of the Array
 
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(const Stack<Type>& copy)                 // Copy constructor
        :m_array(copy.m_array),m_current(m_array.Size()-1) 
            {   //the current position is the last index of the Array copied
                
            }
 
    template<class Type>
    Stack<Type>::~Stack()                                       // Destructor
        {
 
        }
    
 
    //----------- Implementation of Accessor(s) member functions -----------//
    template<class Type>
    int Stack<Type>::Current() const
        {
 
            
 
            return m_current;
        }
 
    
    //----------- Implementaion of Modificator(s) member(s) function -----------//
    template<class Type>
    void Stack<Type>::Push(const Type& element)
        {   
            
            m_array->SetElement(element,m_current); 
            ++m_current;
 
        
        }
    
    template<class Type>
    Type Stack<Type>::Pop()
        {
        
        Type    result =  m_array->GetElement(m_current - 1);
        --m_current;
        
        return result; 
        
        }
 
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    template<class Type>
    Stack<Type>& Stack<Type>::operator=(const Stack<Type>& s)   // Asignment operator
        {
            if(this!=&s)        //handle self assignment
            {
                this->Stack<Type>::operator=(s);
                m_current = s.m_current;
            }
 
            return(*this);
        }
 
#endif


При это const у Current() функции убирать нельзя полубас доебу...я почему аксессор не конст
Миниатюры
Templates (composition). exception handling run-time error  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 20:16     Templates (composition). exception handling run-time error #11
Эксепшны от Array стек перехватывать не должен. Он должен их вообще не допускать. Если где-то вылетел эксепшн у Array, то это или не проблема стека (память закончилась или что там ещё), или стек где-то что-то не уследил и пишет не по валидному индексу. Да, с точки зрения Array это исключительная ситуация, но с точки зрения стека — нет: индексы генерирует сам стек, а не его пользователь, а значит стек может следить за их правильностью; если вылетело исключение от Array внутри, это значит стек не уследил и это баг, а не исключительная ситуация, его надо исправлять, а не обрабатывать. Ну или это действительно исключительная ситуация, но не для стека: он же не знает, что надо делать, если память кончилась.

У стека самого по себе может приключиться две беды: или мы делаем pop() пустого стека (в таком случае мы внутри ничего не трогаем и ругаемся исключением), или (в случае фиксированного массива, выделенного под стек) мы делаем push() в стек, который заполнен под завязку (тут мы тоже ничего не трогаем и сразу же выкидываем исключение; вот этого сейчас не делается, да, надо в push дописать соответствующую проверку). Это не проблема стека, почему его используют неправильно. Его задача в таком случае сообщить пользователю о его кривых руках и ничего при этом не поломать.


А что не так с индексами? В первом случае мы засунули пять элементов, потом стек кончился. В стеке пять элементов, его Current имеет правильное значение 5: если бы там было больше свободного места, то следующий засунутый в стек элемент находился бы в array[5]. Во втором случае аналогично.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 20:26  [ТС]     Templates (composition). exception handling run-time error #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эксепшны от Array стек перехватывать не должен. Он должен их вообще не допускать. Если где-то вылетел эксепшн у Array, то это или не проблема стека (память закончилась или что там ещё), или стек где-то что-то не уследил и пишет не по валидному индексу. Да, с точки зрения Array это исключительная ситуация, но с точки зрения стека — нет: индексы генерирует сам стек, а не его пользователь, а значит стек может следить за их правильностью; если вылетело исключение от Array внутри, это значит стек не уследил и это баг, а не исключительная ситуация, его надо исправлять, а не обрабатывать.

У стека самого по себе может приключиться две беды: или мы делаем pop() пустого стека (в таком случае мы внутри ничего не трогаем и ругаемся исключением), или (в случае фиксированного массива, выделенного под стек) мы делаем push() в стек, который заполнен под завязку (тут мы тоже ничего не трогаем и сразу же выкидываем исключение; вот этого сейчас не делается, да, надо в push дописать соответствующую проверку). Это не проблема стека, почему его используют неправильно. Его задача в таком случае сообщить пользователю о его кривых руках и ничего при этом не поломать.
Да это все понятно это просто учебный проект я знаю что вообще не кто так не делает все STL vector юзают или другие ассоциативный или не ассоциативный контейнеры

Добавлено через 38 секунд
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

А что не так с индексами? В первом случае мы засунули пять элементов, потом стек кончился. В стеке пять элементов, его Current имеет правильное значение 5: если бы там было больше свободного места, то следующий засунутый в стек элемент находился бы в array[5]. Во втором случае аналогично.
Так понятно что элементов 5 индек то от 0 до 4

поэтому 4 должно быть

Добавлено через 3 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение


А что не так с индексами? В первом случае мы засунули пять элементов, потом стек кончился. В стеке пять элементов, его Current имеет правильное значение 5: если бы там было больше свободного места, то следующий засунутый в стек элемент находился бы в array[5]. Во втором случае аналогично.
он подлец видишь как заканчивает Push() он currect в 5 ставить хотя макс индекс должен быть 4 поэтому и приходиться извращаться там GetElement(m_currect - 1) -> писать хотя по нормальному надо GetElement(m_currect ) так написать

у меня по заданию короче написано что
Make sure the current index is not changed when the Array class threw an exception.
Типа Убедитесь что коррент индекс не меняется когда threw ловит эксепшен

А он подлец меняет !

вот задание целиком если кому интересно
Миниатюры
Templates (composition). exception handling run-time error  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 20:38     Templates (composition). exception handling run-time error #13
Цитата Сообщение от Leeto Посмотреть сообщение
Да это все понятно это просто учебный проект я знаю что вообще не кто так не делает все STL vector юзают или другие ассоциативный или не ассоциативный контейнеры
vector, кстати, эксепшнов вообще не выкидывает. Не туда полез — получай свой сегфолт.
Цитата Сообщение от Leeto Посмотреть сообщение
Так понятно что элементов 5 индек то от 0 до 4

поэтому 4 должно быть
Нет, именно 5. В данном смысле: current это указатель на верхушку стека. То есть на то место, куда будет помещён следующий элемент. Именно поэтому изначально он равен нулю, а не минус единице. Именно поэтому он фактически совпадает с количеством засунутых в стек элементов.
Код
  индекс 0 1 2 3 4 (5)
    стек - - - - -
верхушка ^

  индекс 0 1 2 3 4 (5)
    стек 4 - - - -
верхушка   ^

  индекс 0 1 2 3 4 (5)
    стек 4 9 5 7 -
верхушка         ^

  индекс 0 1 2 3 4 (5)
    стек 4 9 5 7 8
верхушка            ^
Цитата Сообщение от Leeto Посмотреть сообщение
у меня по заданию короче написано что
Make sure the current index is not changed when the Array class threw an exception.
Типа Убедитесь что коррент индекс не меняется когда threw ловит эксепшен

А он подлец меняет !
Да ничего он не меняет. Как было 5 или 0, так и осталось. Вот если бы они стали 6 или –1, тогда это беда — стек попытался всё же что-то пушнуть или попнут, а значит вылез за границу.

А насчёт задания... Ну раз сказано не делать проверок, то не делайте.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.08.2012, 20:46  [ТС]     Templates (composition). exception handling run-time error #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
vector, кстати, эксепшнов вообще не выкидывает. Не туда полез — получай свой сегфолт.
Нет, именно 5. В данном смысле: current это указатель на верхушку стека. То есть на то место, куда будет помещён следующий элемент. Именно поэтому изначально он равен нулю, а не минус единице. Именно поэтому он фактически совпадает с количеством засунутых в стек элементов.
Код
  индекс 0 1 2 3 4 (5)
    стек - - - - -
верхушка ^

  индекс 0 1 2 3 4 (5)
    стек 4 - - - -
верхушка   ^

  индекс 0 1 2 3 4 (5)
    стек 4 9 5 7 -
верхушка         ^

  индекс 0 1 2 3 4 (5)
    стек 4 9 5 7 8
верхушка            ^
Да ничего он не меняет. Как было 5 или 0, так и осталось. Вот если бы они стали 6 или –1, тогда это беда — стек попытался всё же что-то пушнуть или попнут, а значит вылез за границу.

А насчёт задания... Ну раз сказано не делать проверок, то не делайте.
Так нет мне надо проверки делать...
да я не сомневаюсь что там с индексами все нормально... я о другом
я думаю о том что когда задача перекидывается на эксепшен в классе Аррей, то там типа прописать а ля m_current + 1 или -1 в зависимость поп это или пуш
что то типа того
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Type> 
        void Array<Type>::SetElement(const Type& ObjType, unsigned int index)
            {   // When the index is out of bounds, ignore the “set”.
                if (index >= m_size || index < 0)  
                    {
                        
                    
                        throw OutOfBoundsException(index);
                        
                        template <class Type> 
                        Stack<Type>::m_current = m_current - 1 ;
                    }
ну там понятно что в Array надо Stack.hpp подключить
только он мне не дает так сделать
я даже m_currect в public перекинул

мол пишет

>------ Build started: Project: L5_4_2_b_ex_4, Configuration: Release Win32 ------
1> main.cpp
Array.cpp(124): error C2951: template declarations are only permitted at global, namespace, or class scope
Array.cpp(117) : while compiling class template member function 'void Array<Type>::SetElement(const Type &,const unsigned int)'
1> with
1> [
1> Type=Point
1> ]
1> Stack.cpp(23) : see reference to class template instantiation 'Array<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
1> Stack.cpp(23) : while compiling class template member function 'Stack<Type>::Stack(int)'
1> with
1> [
1> Type=Point
1> ]
1> main.cpp(48) : see reference to class template instantiation 'Stack<Type>' being compiled
1> with
1> [
1> Type=Point
1> ]
Array.cpp(125): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Array.cpp(125): error C2350: 'Stack<Type>::m_current' is not a static member
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

может быть в конструкторе ArrayException прописать что мол если m_currect больше 4 или меньше 0 то присвоить 0 или 4
Это компилятор съест или ругаться будет ??? или это вообще очень не устойчиво смотрится и мне за это отругают ???
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 21:06     Templates (composition). exception handling run-time error #15
А что вы намереваетесь сделать в строках 11–12? Array же понятия не имеет, где он: просто сам по себе или в стеке. Если ему передан кривой индекс, он выкидывает исключение и всё.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
05.08.2012, 01:26  [ТС]     Templates (composition). exception handling run-time error #16
delete message

Добавлено через 3 часа 59 минут
Цитата Сообщение от Leeto Посмотреть сообщение
delete message
короче я вот так сделал вроде работает... конечно на грани читабильности...
Если какие ниб предложения по поводу того как можно по красивше сделать

Array_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//                                                      
//                                                  (---.Array_hpp---)
//
#ifndef Array_HPP   // Preprocessor gates
#define Array_HPP
 
    #include <sstream>
    #include <iostream>
 
    template <class Type>   
    class Array
        {
    
            protected:                  // Declaration of private data members 
               int m_size;
              Type*        m_data;      //m_data should be a pointer, since you want to allocate data to it
 
            public:                     // Public declaration of data members (in given example haven't ) and member functions 
              static int m_size_default;
 
                //----------- Declaration of Constructors -----------//
               int global_index; 
              Array();                                  // Default constructor
              Array(const unsigned int new_size);       // Constructor 
              Array(const Array<Type>& ObjArray);       // Copy constructor
              ~Array();                                 // Destructor
 
              //----------- Declaration of  Accessors member functions -----------//
              Type& GetElement(  int index) ;
              static int  DefaultSize() ;
              int Size() const;
 
              //----------- Declaration of Modificator(s) member functions -----------//
              void Swap(Array& ObjArray);  
              void SetElement(const Type& ObjType,   int index);
              static void DefaultSize( int newSize) ;
 
              //----------- Declaration of Operators Overloading the class's members -----------//
              Array<Type>& operator =   (const Array& ObjArray);                //Const correctness here.
              const Type& operator  []  (unsigned int index) const;
              Type& operator        []  (unsigned int index);           
        };
 
 
    #ifndef Array_cpp // Must be the same name as in source file #define
 
        #include "Array.cpp"
 
    #endif //#ifndef Array_cpp is CLOSED
 
 
 
 
#endif //  #ifndef Array_HPP is CLOSED


ArrayException_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//                                                      
//                                                  (---.ArrayException_hpp---)
//
#ifndef ArrayException_HPP
#define ArrayException_HPP
 
    #include <iostream>
    #include <string>
    #include "Stack.hpp"
    using namespace std;
 
    class ArrayException 
    {
    protected: 
 
    public : 
        ArrayException () {};
        virtual std::string GetMessage() const = 0;
    };  
 
    class OutOfBoundsException : public ArrayException
    {
    private : 
             int m_index;
    public : 
        OutOfBoundsException();
        OutOfBoundsException( int  current_index) : m_index( current_index) 
        {
        
        } 
        std::string GetMessage() const
        
        {
            
            
             
        std::ostringstream os;                          // std::stringstream object
                    os  << "\nEXCEPTION HANDLING ERROR: "
                        << "the given element " 
                        << "with index : " 
                        << m_index 
                        << " is out of bounds\n "   ;
                    return os.str();    
        }
 
    };
 
#endif // ArrayException_HPP


Point_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//                                                      
//                                                  (---.Point_hpp---)
//  
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
// Lib(s)
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <cmath>
 
    class Point 
        {   
            private:        // Declaration of private data members 
            double x;       // X coordinate
            double y;       // Y coordinate
 
            public: // Public declaration of data members (in given example haven't ) and member functions 
 
 
                //----------- Declaration of Constructors -----------//
            Point();                                                // Default constructor
            Point(const double newX ,const double newY) ;           // Constructor 
            explicit Point(const double value );                    // Second Constructor 
            Point (const Point& ObjectOfClassPoint);                // Copy constructor
            ~Point();                                               // Destructor
 
 
            //----------- Declaration of  Accessors member functions -----------//
            std::string ToString() const;    
            double X() const;                   
            double Y() const;   
            ///*virtual*/ void Draw() const { std::cout << "This's  Point from Draw()\n"; }
 
 
            //----------- Declaration and  of and Implementaion of setters member functions -----------//
            void X(const double newX) {x = newX;};  // The x-coordinate
            void Y(const double newY) {y = newY;};  // The y-coordinate
 
 
            //----------- Declaration of Calculators (additional functionality) member functions -----------//
            double Distance() const;
            double Distance(  const Point  & ObjPoint ) const;
 
 
            //----------- Declaration of Operators Overloading the class's members -----------//
            Point  operator -  () const;                                    // Negate the coordinates.
            Point  operator *  (double factor) const;                       // Scale the coordinates.
            Point  operator +  (const Point& ObjPoint) const;               // Add coordinates.
            bool   operator == (const Point& ObjPoint) const;               // Equally compare operator.
            Point& operator =  (const Point& ObjPoint);                 // Assignment operator.
            Point& operator *= (double factor );                        // Scale the coordinates & assign.
            Point& operator += (const Point& ObjPoint);
            Point& operator -= (const Point& ObjPoint);
 
 
            //----------- Declaration of Global Ostream << Operator  -----------//
            friend std::ostream& operator << (std::ostream& out,const Point & ObjPoint); 
    
        };
 
    //----------- Implementaion (inline) of getters member functions -----------//
    // Given functions should be const because we not willing 
    // modify contained variables when we call those fucntions in any case
    inline  double Point::X() const {return x;};                    
    inline  double Point::Y() const {return y;};    
 
 
#endif // Point_HPP


Stack_hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//                                                      
//                                                  (---.Stack_hpp---)
//  
#ifndef STACK_HPP
#define STACK_HPP
 
    #include    "Array.hpp"
 
    template<class Type>
    class Stack
        {
            private:
                
                int m_current;
                
                Array<Type>* m_array;
                
 
            public:
 
                //----------- Declaration of Constructors -----------//
                Stack();                            // Default (Nullary ) Construcotr
                Stack(int size);                    // Non-nullary Constructor 
                Stack(const Stack<Type>& copy);     // Copy Constructor
                ~Stack();                           // Destructor
    
                //----------- Declaration of  Accessors member functions -----------//
                
                int Current() const;
                //----------- Declaration of Modificator(s) member functions -----------//
                void Push(const Type& element);         // Add a new element to the array
                Type Pop();                             // Remove the last element of the array
                
                void IndexCorrection(); 
   
                //----------- Declaration of Operators Overloading the class's members -----------//
                Stack<Type>& operator = (const Stack<Type>& ObjStack);      //assignment operator
                
        };
 
    #ifndef STACK_CPP 
 
        #include"Stack.cpp"
 
    #endif // STACK_CPP is CLOSED
 
#endif // // STACK_HPP is CLOSED


Array_CPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//                                                      
//                                                  (---.Array_CPP---)
//  
 
#ifndef Array_CPP   // Preprocessor gates
#define Array_CPP
 
        #include "Array.hpp"
        #include "Stack.hpp"
        
    template <class Type>
    int Array<Type>::m_size_default = 10;
 
    //----------- Implementation of Constructors -----------//
        template <class Type>
        Array<Type>::Array() : m_size(10), m_data(0), global_index(0)
            { 
 
            }
 
        template <class Type>
        Array<Type>::Array(unsigned int new_size) 
            : m_size(new_size), m_data(new Type[new_size]), global_index(0)
            { 
 
            }
 
        template <class Type>
        Array<Type>::Array(const Array& ObjArray) : m_data(0), m_size(0)
            {
                
              if(!ObjArray.m_data) {return;}
 
              Array tmp;                // Copy construct into another temporary array, 
                                        // this way, if something throws, tmp will clean itself up.
 
              //Create the array
              tmp.m_data = new Type[ObjArray.m_size];
              tmp.m_size = ObjArray.m_size;
 
              //Copy the array elements
              for(unsigned int i = 0; i < tmp.m_size; ++i)
                {tmp.m_data[i] = ObjArray.m_data[i];}
 
              //All done! swap into this!
              this->Swap(tmp);
            }
 
 
        template <class Type>
        Array<Type>::~Array()
            {
              //Technically, the if is not necessary
              if(m_data)
                  {
                    delete[] m_data;
                    m_data = 0;
                  }
 
              //Not necessary either, but just to be clean
              m_size = 0;
            }
 
        //----------- Implementation of Accessor(s) member functions -----------//
 
        template <class Type> 
        Type& Array<Type>::GetElement(  int index) 
            
                {   
                //  std::cout << "\nget index is "  << index; 
                      index = global_index; 
                //  std::cout << "\nget index is AFTER global_index "  << index; 
                    std::cout << "GetElement -> " ;
                    if (global_index > m_size || global_index < 0)  
                        { 
                            
                    //      if (global_index >= m_size)
                    //      {
                    //          throw OutOfBoundsException(global_index--);
                    //      }
 
                    //  if (global_index < 0)
                //          {
                                throw OutOfBoundsException(global_index++);
                //          }
                
                        }
 
 
                return m_data[global_index];
                
                }
 
        template <typename Type>
        int Array<Type>::DefaultSize() 
            { 
                return m_size_default;
            }
 
        template<class Type>
        int Array<Type>::Size() const
            {
                return this->m_size; 
            }
 
        
        //----------- Implementaion of Modificator(s) member(s) function -----------//
 
        template <class Type>
        void Array<Type>::Swap(Array& ObjArray)
            {
                //std::swap()  - try to implement std swap function 
              Type* data = m_data;
       unsigned int size = m_size;
              m_data     = ObjArray.m_data;
              m_size     = ObjArray.m_size;
         ObjArray.m_data = data;
         ObjArray.m_size = size;
            }
 
        
        
        template <class Type> 
        void Array<Type>::SetElement(const Type& ObjType,   int index)
            {   
                global_index = index; 
                // When the index is out of bounds, ignore the “set”.
                if (global_index >= m_size || global_index < 0)  
                    {
                        if (global_index >= m_size)
                            {
                                throw OutOfBoundsException(global_index--);
                            }
 
                        if (global_index < 0)
                            {
                                throw OutOfBoundsException(++global_index);
                            }
                        
                        
                    }   
 
                m_data[global_index] = ObjType;
                std::cout 
                    << " Set Element <- " 
                    << ObjType  
                    << std::endl;
            }
 
        template <typename Type>
        void Array<Type>::DefaultSize( int newSize) 
            { 
                m_size_default = newSize; 
            }
 
        //----------- Implementation of Operators Overloading the class's member -----------//
 
        template <class Type>
        Array<Type>& Array<Type>::operator = (const Array& ObjArray)
            {
              //Check self assign:
              if(this == &ObjArray) {return *this;}
 
              Array<Type> copy(ObjArray);   //Create a copy of ObjArray; If this fails, then *this will not be changed, and nothing will leak
 
                                            //Succeeded creating copy. Now we can put it inside this
              this->Swap(copy);             //And then swap the copy into this!
 
              return *this;
            }
 
        template <class Type> 
        Type& Array<Type>::operator [] (unsigned int index) 
            {
            //  cout << "Array [] operator" << endl;
 
                if (index >= this->m_size)
                {
                //  cout << "i am hreeeee" << endl;
                    return this->m_data[0];
                }
                return m_data[index];
            }
 
        template <class Type> 
        const Type& Array<Type>::operator [] (unsigned int index) const
            {   
                if (index > this-> m_size)
                        {
                            std::cout 
                                << "OUT OF BOUND ";
                            return this->m_data[0];
                        }
                return m_data[index];
            }
 
 
 
#endif //Array_CPP


Point_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//                                                      
//                                                  (---.Point_cpp---)
//  
    #include "Point.hpp"
 
 int number_of_point_constructor_calls          = 1 ;   
 int number_of_point_destructor_calls           = 1 ;  
 int number_of_point_assignment_operator_calls  = 1 ; 
 
 
                //----------- Implementation of Constructors -----------//
    Point::Point() : x(0) , y(0)            // Default constructor (implemented using colon syntax )                                    
            { 
            //  std::cout << "hi my default constructor\n\n\t";
            }                           
 
 
    Point::Point(const double newX ,const double newY) : x(newX)  , y(newY)     // Constructor 
            { 
        //      std::cout << " My Point constructor was called " << number_of_point_constructor_calls++ << " times " << "\n"; 
            }                   
 
    Point::Point(const double value ) : x(value)                // Second Constructor 
            { 
            //std::cout << "hi my constructor\n\n\t"; 
            }   
    Point::~Point()                                             // Destructor
            {
            //  std::cout << " My Point destructor was called " << number_of_point_destructor_calls++ << " times " << "\n"; 
            }                                    
 
    Point::Point (const Point& ObjectOfClassPoint)              // Copy constructor
            {
                //std::cout << "this is COPY constructor\n\n\t ";
                x = ObjectOfClassPoint.x;
                y = ObjectOfClassPoint.y;
            }
        
 
                //----------- Implementation of Accessor(s) member functions -----------//
    std::string Point::ToString() const
            {
            //  std::string s=Shape::ToString();                                
                std::ostringstream os;                          // std::stringstream object
                os << " Point (" << x << ", " << y << ") " ;    // customization of output and calling base class functuanality 
                return os.str();                                // str() function retrieve the string from the string buffer
            }
 
 
                //----------- Implementation of Calculators (additional functionality) member functions -----------//
    double  Point::Distance() const
 
            {
                return std::sqrt(pow(x,2) + pow(y,2));
            }
 
 
    double  Point::Distance(const Point   &ObjPt ) const
    
            {
                return std::sqrt(pow((x-ObjPt.x),2) + pow(y - ObjPt.y,2)); 
            }
 
 
            //----------- Implementation of Operators Overloading the class's member -----------//
    Point Point::operator  -  () const                                  // Negate the coordinates.          
        {
            return Point(-x,-y);
        }
 
    Point Point::operator  *  (double factor) const                     // Scale the coordinates.
        {
            return Point(x * factor, y * factor);
        }
 
    Point Point::operator  +  (const Point& ObjPoint) const             // Add coordinates.
        { 
            return Point(x + ObjPoint.x, y + ObjPoint.y);
        }
 
    bool Point::operator   == (const Point& ObjPoint) const             // Equally compare operator.    
        {
            return (x==ObjPoint.x)&(y==ObjPoint.y);
        }
 
    Point& Point::operator =  (const Point& ObjPoint)                           // Assignment operator.             
                {       
            //      std::cout << " My Point assignment operator was called " << number_of_point_assignment_operator_calls++ << " times " << "\n"; 
                    x=ObjPoint.x, y=ObjPoint.y;
                    return *this;                                               // The meaning of *this explained in this example (implementation) see comment out  
                }
 
    Point& Point::operator *= (double factor)                                   // Scale the coordinates & assign.      
        {
            x *= factor; 
            y *= factor;
 
            return *this ; 
        }
    
 
    Point& Point::operator += (const Point& ObjPoint)  
        {
                x += ObjPoint.x;
                y += ObjPoint.y;
 
                return *this;
        }
 
    Point& Point::operator -= (const Point& ObjPoint)
        {
                x -= ObjPoint.x;
                y -= ObjPoint.y;
 
                return *this;
        }
 
 
    //----------- Implementation of GLOBAL Ostream << Operator  -----------//
    std::ostream& operator << (std::ostream& out,const Point & ObjPoint)
            {
                return out << "[" << ObjPoint.x << "," << ObjPoint.y << "]" ; 
                
            }


Stack_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//                                                      
//                                                  (---.Stack_cpp---)
//  
 
 
#ifndef STACK_CPP
#define STACK_CPP
 
    #include "Stack.hpp"
    
    
        
    //----------- Implementation of Constructors -----------//
    template<class Type>                            
    Stack<Type>::Stack()                                        // Default constructor
        :m_array(new Array<Type>()),m_current(m_array->global_index) 
        {   //the current position is the last index of the Array
            
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(int size)                    
        :m_array(new Array<Type>(size)),m_current(m_array->global_index)       
        {   //the current position is the last index of the Array
 
        }
 
    
 
    template<class Type>
    Stack<Type>::Stack(const Stack<Type>& copy)                 // Copy constructor
        :m_array(copy.m_array),m_current(m_array.Size()-1) 
            {   //the current position is the last index of the Array copied
                
            }
 
    template<class Type>
    Stack<Type>::~Stack()                                       // Destructor
        {
 
        }
    
 
    //----------- Implementation of Accessor(s) member functions -----------//
    template<class Type>
    int Stack<Type>::Current() const
        {
 
            return m_array->global_index;
        }
    
    
    //----------- Implementaion of Modificator(s) member(s) function -----------//
    template<class Type>
    void Stack<Type>::Push(const Type& element)
        {   
                    
                                    if (smart_point <= 0)
                                    {
                                    std::cout <<"this is glob index *****"<< m_array->global_index; 
                                    m_array->SetElement(element,m_array->global_index); 
                                    smart_point++;
                                    goto finish; 
                                    }
                                
                                    
                            
                        m_array->global_index++;
                            
                        std::cout <<"this is glob index "<< m_array->global_index; 
                        m_array->SetElement(element,m_array->global_index); 
                        
                        finish:;
                    
                        //++m_array->global_index;
                                
                    
                    
                    
                    
                    
                    
        
        }
    
    template<class Type>
    Type Stack<Type>::Pop()
        {
            if (very_smart_point <= 0)
                                    {
                                    std::cout <<"this is glob index *****"<< m_array->global_index; 
                                    //Type result = m_array->GetElement(m_array->global_index); 
                                    very_smart_point++;
                                    goto finish; 
                                    }
                                
                                    
                            
                        m_array->global_index--;
                            finish: 
                        std::cout <<"this is glob index "<< m_array->global_index; 
                        Type result = m_array->GetElement(m_array->global_index); 
                        
                    //return result;    
            
        return result; 
        
        }
    template <class Type> 
    void Stack<Type>::IndexCorrection()
    {
        m_current = m_array->Size()-1; 
    }
 
    
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    template<class Type>
    Stack<Type>& Stack<Type>::operator=(const Stack<Type>& s)   // Asignment operator
        {
            if(this!=&s)        //handle self assignment
            {
                
                this->Stack<Type>::operator=(s);
                m_current = s.m_current;
            }
 
            return(*this);
        }
 
#endif


main_cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//                                                      
//                                                  (---.main_cpp---)
//
//      Lib(s)
        #include <iostream>
 
//      Header(s)
        #include "Point.hpp"
        #include "Array.cpp"
        #include "Stack.cpp"
        #include "ArrayException.hpp"
 
        using namespace std;
            int smart_point = 0; 
            int very_smart_point = 0; 
            
int main()
{
 
 
    //!!!!!!Make sure the current index is not changed when the Array class throws an exception.!!!!!!
    
 
    
    const unsigned int size_of_data_array = 10; 
 
    double data_x[size_of_data_array] 
                =   {1830 , 190.1 , 1914 , 1900 , 1839  , 
                     1865 , 1914  , 1633 , 1656 , 18.95 } ; 
 
    double data_y[size_of_data_array] 
                = { 1903 , 1834 , 1812 , 1088 , 1789, 
                   19.47 , 1211 , 1969 , 1535 , 1628   } ; 
 
     
    // Creating an array of Point pointers 
    // with size_of_array elements on the heap.
    Point** MyArrayOfPointers = new Point*[size_of_data_array];         
        
   
    for (unsigned int i = 0 ; i <size_of_data_array; i++ )                      
        { 
    // Create for each element in the array a point on the heap.
            MyArrayOfPointers[i] = new Point(data_x[i],data_y[i]);                                                                                      
        }
 
    const unsigned int size_of_stack = 5; 
    const unsigned int too_big_index = size_of_stack + size_of_stack/2;
    const unsigned int index_of_loop = size_of_data_array; //too_big_index; 
 
 
    Stack<Point> s(size_of_stack);
 
    
    std::cout << " Size of the Stack is:      " << size_of_stack << "\n";
    std::cout << "  Point data array is:      " << size_of_data_array << "\n";
    std::cout << "Index of loops for testing\nPush and Pop fucntions are: " << index_of_loop << "\n";
    
 
                                        cout << "\n\n\t\t --- TEST  of Push() function --- " << endl;
 
    cout << "current possition is BEFORE pushing : " << s.Current() << endl;
 
 
for(unsigned int i = 0;i<index_of_loop;i++)
    {
        try {
            
                      // std::cout << " index : "   << s.Current() << "  " ;
         s.Push(*MyArrayOfPointers[i]); // 
        
            }
 
        catch ( ArrayException& objArrayException )
                 {
                
                    std::cout << objArrayException.GetMessage() ;
                 }  
    }
 
 
std::cout   << "\nLet's making sure the current index is not\nchanged when the Array class throws an exception." 
            << "\nSo currect index after a lot of incorrect usage of\nPush() function should be 4 let's see -> " 
            << s.Current() 
            << " This is correct index "; 
 
 
    
                                    cout << "\n\n\t\t --- TEST of Pop() function --- " << endl;
for(unsigned int i = 0; i<index_of_loop;i++)
    {
        try {
        
                      std::cout << s.Pop()<<endl;
            }
 
    catch ( ArrayException& objArrayException )
                 {
                    std::cout << objArrayException.GetMessage() ;
                 }   
    }
 
 
 
std::cout   << "\nLet's making sure the current index is not\nchanged when the Array class throws an exception." 
            << "\nSo currect index after a lot of incorrect usage of\nPop() function should be 0 let's see -> " 
            << s.Current() 
            << " This is correct index "; 
 
    std::cout << "\n\n\n";
    cout << endl;
    return 0;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.08.2012, 02:02     Templates (composition). exception handling run-time error #17
Красивее...

Ну что ж.
<IMHO>
0. Подкачайте английский всё же.
<IMHO в квадрате>
1. Поменьше бессмысленных комментариев.
2. Одной пустой строки вполне достаточно.
3. Единообразие отступов, форматирования и пробелов важно.
4. Поменьше бессмысленных отступов.
</IMHO в квадрате>
5. Откройте для себя Google Testing Framework или нечто подобное.
6. Не надо комментировать ненужный код для «авось пригодится».
</IMHO>
7. Вводу-выводу не место в сеттерах-геттерах класса-контейнера.
8. Глобальные переменные, используемые объектами, это в общем случае плохо.
8.5. Глобальные переменные для индексов, используемые в сеттерах — это НЕПЕРЕДАВАЕМО плохо.
9. Возможно, они не глобальные и я запутался; тогда пункт 9 такой: называйте переменные так, чтобы по имени было однозначно понятно, что это и откуда.
10. И собирайте их в одном месте, чтобы не чертыхаться по хедеру в их поисках.
11. Ах да, public-поля у классов — это тоже попахивает.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
05.08.2012, 18:50  [ТС]     Templates (composition). exception handling run-time error #18
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Правильный вопрос. В стеке — нет. Вот удаляется элемент из стека. Но ведь на самом деле он там остался же, это только указатель верхушки сдвинулся. Так что надо вызвать для него деструктор, как только он удаляется из стека:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class Type>
    Type Stack<Type>::Pop()
        {
            if (m_current == 0)
                {
                    throw /*какой-нибудь*/ InvalidStateException();
                }
            Type result = m_array->GetElement(m_current - 1);
            m_array->GetElement(m_current - 1).~Type();
            --m_current;
            return result;
        }
У меня тут мысля возникла... Разве Array не манагерет процессом удаления элементов ???
Может тупа оставить пустую имплементацию дестрактора в шаблове Стек ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 19:06     Templates (composition). exception handling run-time error
Еще ссылки по теме:

run-time type information C++
Run-Time Check Failure #3 C++
C++ Затаившийся run-time error

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.08.2012, 19:06     Templates (composition). exception handling run-time error #19
Цитата Сообщение от Leeto Посмотреть сообщение
У меня тут мысля возникла... Разве Array не манагерет процессом удаления элементов ???
Может тупа оставить пустую имплементацию дестрактора в шаблове Стек ???
Нет, с чего бы это он им управлял? Если не вызывать деструктор, то вы только скопировали себе в result элемент Array. Естественно, он там так и остался лежать, поэтому-то его и надо удалять, потому что для стека он там не должен оставаться. (Ну, или как вариант: удалять его непосредственно перед тем, как туда что-то записать поверх.)

Array удалит все элементы только при удалении самого себя.
Yandex
Объявления
05.08.2012, 19:06     Templates (composition). exception handling run-time error
Ответ Создать тему
Опции темы

Текущее время: 08:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru