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 に答える