Copy constructor

이세진·2022년 4월 3일
0

Computer Science

목록 보기
24/74

생성일: 2021년 10월 30일 오전 1:04

Linked Structure로 만들어진 Stack에 Copy constructor를 추가해보았다.

다른 함수들은 당연히 기존의 Linked Stack과 같기 때문에 생략하였다.

template <class ItemType>
struct NodeType;

template <class ItemType>
class StackType
{
public:
	StackType();
	~StackType();
	StackType(const StackType<ItemType>& anotherStack); // Copy constructor
	bool IsFull() const;
	bool IsEmpty() const;
	void Push(ItemType newItem);
	void Pop();
	ItemType Top();

private:
	NodeType<ItemType>* topPtr;	//NodeType을 꼭 전방선언을 해주어야한다 (NodeType Struct정의는 이 줄보다 아래에 있기 때문에 전방선언 하지 않으면 여기서 에러 뜸)
};

template<class ItemType>
StackType<ItemType>::StackType(const StackType<ItemType>& anotherStack)
{
	NodeType<ItemType>* ptr1;
	NodeType<ItemType>* ptr2;

	if (anotherStack.topPtr == NULL)	//복사하고자 하는 원본이 비어있을 때
		topPtr = NULL;
	else
	{
		topPtr = new NodeType<ItemType>;
		topPtr->info = anotherStack.topPtr->info; //우선 한 칸을 만들어서 원본의 가장 첫 노드를 복사한다.
		ptr1 = anotherStack.topPtr->next;
		ptr2 = topPtr;
		while (ptr1 != NULL)	//ptr1이 원본 스택을 쭉 돌면서 한 노드 씩 복사하는데 새로운 NodeType을 동적할당하여 deep copy 한다.
		{
			ptr2->next = new NodeType<ItemType>;
			ptr2 = ptr2->next;
			ptr2->info = ptr1->info;
			ptr1 = ptr1->next;
		}
		ptr2->next = NULL;	//마지막 노드의 next값을 NULL로 설정
	}
}

위와 같은 방법 말고도 operator=을 오버로딩하여 copy시킬 수도 있다.

profile
나중은 결코 오지 않는다.

0개의 댓글