0

我正在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;
    }
}

输出如下所示:

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

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

数组构造函数调用

堆栈构造函数调用

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

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

堆栈赋值运算符调用

堆栈赋值运算符调用

堆栈赋值运算符调用

堆栈赋值运算符调用

堆栈赋值运算符调用

堆栈赋值运算符调用

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

谢谢。

4

2 回答 2

1

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

由于我注意到您检查了自赋值,请注意进行自赋值检查的赋值运算符要么进行不必要的检查,要么不是异常安全的。

于 2012-09-29T20:01:35.920 回答
0

当您这样做时,您正在递归地调用 = 运算符:

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

如果您尝试调用基本操作员,您应该尝试:

base->operator=(source);
于 2012-09-29T20:01:50.757 回答