C++学習ノート(19)コピーオペレータ関数stackクラスの定義

2061 ワード

学習のポイント:
1このstackクラスの定義と使用を学習します.
2コピーオペレータ関数=、およびいつコピーオペレータ関数を書き換える必要があるか.
3 stringオブジェクトの文字列がスタックに格納されているためmemcpyでstring配列をコピーすることはできないことを覚えておいてください.memcpyは浅いコピーを引き起こし、複数回の解放の問題を引き起こす可能性があります.
#include <iostream>
using namespace std;
typedef string T;
typedef unsigned int unit;

class Stack
{	
	T *mem;//string        new     
	unit max;
	unit len;
public:
	Stack(unit n):mem(new T[n]), max(n), len(0) {}
	//             max         
	Stack(Stack &s):max(s.max),len(0),mem(new T[s.max])
	{	
	}
	
	~Stack(){delete[] mem;}
	
	unit max_size() const {return max;}
	unit size() const{return len;}
	Stack& push(const T& e)
	{
		if(len >= max) throw 1;
		else mem[len++] = e;
		return *this;
	}
	
	T pop(T& e)
	{
		if(len ==0 ) throw 0;
		return mem[--len];
	}
	
	void print() const 
	{
		for(int i = 0; i< len; i++)
		{
			cout << mem[i] << "|";
		}
		cout   << endl;
	}
	
	
	//                      
	Stack& operator=(const Stack& s)
	{
			if(this == &s) return *this; //                            

			delete[] mem; //     
			string *temp  = new T[s.max];
			len = s.len;
			for(int i =0; i< len;i++)
			{
				mem[i] = s.mem[i];
			}
		return *this;
	}
	
};

int main()
{
	Stack s1(5);
	//s1.push(1);
	//       push()     Stack       。
	s1.push("hello").push("good morning").push("  ");
	s1.print();
	
	//         Stack s2(s1);          :    (     )
	//                mem    
	Stack s2(s1);
	s2.print();
	s2.push("  ").push("  ");
	s2.print();
	//             
	//
	s1 = s2;
	cout << "s1 = s2   print" <<endl;
	s1.print();
	//              。                。 
	//       
	/*
	glibc detected *** ./a.out: double free or corruption (fasttop): 0x0809e078 ***
	======= Backtrace: =========
	/lib/libc.so.6(+0x6c501)[0x17c501]
/	lib/libc.so.6(+0x6dd70)[0x17dd70]
	*/
}
/*
  :
                ,                          ,
           。
                  
                (operator=)     
*/