クラスをデータメンバーとして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;
}
}
出力は次のようになります。
配列コンストラクター呼び出し(デフォルト)
スタックコンストラクター呼び出し(デフォルト)
配列コンストラクター呼び出し
スタックコンストラクター呼び出し
配列コンストラクター呼び出し(デフォルト)
スタックコンストラクター呼び出し(デフォルト)
スタック代入演算子の呼び出し
スタック代入演算子の呼び出し
スタック代入演算子の呼び出し
スタック代入演算子の呼び出し
スタック代入演算子の呼び出し
スタック代入演算子の呼び出し
スタック代入演算子呼び出し[キャンセルするまで無限に繰り返す]
ありがとう。