我正在为数据存储创建一个新的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;
}
}
输出如下:
数组构造函数调用(默认)
堆栈构造函数调用(默认)
数组构造函数调用
堆栈构造函数调用
数组构造函数调用(默认)
堆栈构造函数调用(默认)
堆栈分配操作员调用
堆栈分配操作员调用
堆栈分配操作员调用
堆栈分配操作员调用
堆栈分配操作员调用
堆栈分配操作员调用
堆栈赋值操作符调用[无限重复,直到我取消它]
感谢。
答案 0 :(得分:1)
对Stack<T>::operator=(source)
的调用会调用您正在实施的运营商。所以你最终会得到无限的回忆。它看起来有点像你想要调用基类的赋值运算符,但是你的Stack
类模板没有基类。
由于我注意到您检查了自我分配,请注意执行自我分配检查的分配操作员要么进行不必要的检查,要么不是例外安全。
答案 1 :(得分:0)
当你执行以下操作时递归调用=运算符:
this->Stack<Type>::operator = (source);
如果您尝试呼叫基本运营商,则应尝试:
base->operator=(source);