堆栈类中的赋值运算符故障

时间:2012-09-29 19:57:01

标签: c++ arrays templates stack

我正在为数据存储创建一个新的Stack类,它使用我的Array类作为数据成员。我仍然在设置构造函数并且在赋值运算符方面遇到了麻烦。

当我调用赋值运算符时,它会被连续调用,直到我手动取消该程序。

你能帮我找到错误吗?

如果有必要,我可以为Array类提供代码,但我认为错误应该包含在下面的某处。

相关代码如下:

堆叠代码:

#ifndef STACK_HPP
#define STACK_HPP

#include "Array_H.hpp"

namespace CLARK{
    namespace Containers{

        template <class Type=T> class Stack
        {
            private:
                int m_current;
                Array<Type> m_array;

            public:
            // constructors and destructors:
                Stack(); // default constructor
                // ...
                ~Stack(); // destructor

            // ...

            // modifiers:
                // overloaded operator functions:
                    Stack<Type>& operator = (const Stack<Type>& source); // assignment operator

        };    
    }
}

#ifndef STACK_CPP
#include "Stack.cpp"
#endif

#endif

堆栈源代码:

#ifndef STACK_CPP
#define STACK_CPP

#include "Stack_H.hpp"

namespace CLARK{
    namespace Containers{

        // constructors and destructors:
        template <class Type>
        Stack<Type>::Stack() : m_array(Array<Type>()) , m_current(0)
        { // default constructor
            cout << "Stack constructor call (default)" << endl;
        }

        // ...

        template <class Type>
        Stack<Type>::~Stack()
        { // destructor
            cout << "Stack destructor call" << endl;
        }

        // ...

        // modifiers:

        // overloaded operator functions:
        template <class Type>
        Stack<Type>& Stack<Type>::operator = (const Stack<Type>& source)
        {// assignment operator
            cout << "Stack assignment operator call" << endl;
            if (this == &source)
                return *this;

            this->Stack<Type>::operator = (source);
            m_current = source.m_current;
            m_array = source.m_array;

            return *this;
        }
    }
}

#endif STACK_CPP 

测试代码:

#include "Point_H.hpp"
#include "Line_H.hpp"
#include "Circle_H.hpp"
#include "Array_H.hpp"
#include "NumericArray_H.hpp"
#include "Stack_H.hpp"
#include "PointArray_H.hpp"
#include "ArrayException_H.hpp"
#include "OutOfBoundsException_H.hpp"

using namespace CLARK::Containers;
using namespace CLARK::CAD;

int main()
{ 

    try
    { 
        Stack<int> testStack; // test default constructor
        Stack<int> testStack2;

        testStack2 = testStack; // test assignment operator 

        return 0; 
    } catch(ArrayException& err) {
        cout << err.GetMessage() << endl;
    }
}

输出如下:

  

数组构造函数调用(默认)

     

堆栈构造函数调用(默认)

     

数组构造函数调用

     

堆栈构造函数调用

     

数组构造函数调用(默认)

     

堆栈构造函数调用(默认)

     

堆栈分配操作员调用

     

堆栈分配操作员调用

     

堆栈分配操作员调用

     

堆栈分配操作员调用

     

堆栈分配操作员调用

     

堆栈分配操作员调用

     

堆栈赋值操作符调用[无限重复,直到我取消它]

感谢。

2 个答案:

答案 0 :(得分:1)

Stack<T>::operator=(source)的调用会调用您正在实施的运营商。所以你最终会得到无限的回忆。它看起来有点像你想要调用基类的赋值运算符,但是你的Stack类模板没有基类。

由于我注意到您检查了自我分配,请注意执行自我分配检查的分配操作员要么进行不必要的检查,要么不是例外安全。

答案 1 :(得分:0)

当你执行以下操作时递归调用=运算符:

this->Stack<Type>::operator = (source);

如果您尝试呼叫基本运营商,则应尝试:

base->operator=(source);