본문 바로가기
C++/열혈 C++

객체(객체 포인터)의 저장/삭제 및 참조에 대한 추상클래스

by Beijing_KingGod 2018. 4. 9.

#include <iostream>
using namespace std;

class Data
{
 int data;
public:
 Data(int d){
  data=d;
 }
 void ShowData(){
  cout<<data<<endl;
 }
};

typedef Data* Element; // 이 부분은 저장될 객체에 따라 변경! // 데이터 = 데이터  // 깊은복사를 하면 메모리가 커지고 // 이 클래스만 바꿀수 있도록 포인터를 타입으로 정한듯
      

class Container
{
private:
 Element* arr; //객체 포인터 배열을 가리키는 포인터 // Data* *arr   Data 형 포인터를 가리킬수 있는 포인터
 int length;  //배열의 길이
 int aIndex;  //저장된 객체의 수

public:
 Container(int len=50);
 ~Container();
 void Insert(Element data); //순차 입력!
 Element Remove(int idx); // idx번째 객체 삭제
 Element GetItem(int idx); // 인덱스 idx의 객체 참조
 int GetElemSum() {return aIndex;} //저장된 객체의 수
};

Container:: Container(int len):aIndex(0)
{
 arr = new Element[len+1]; // Data형 포인터를 가리킬수 있는 포인터에 동적 메모리 할당 해줌 // Element형 배열 arr[0]....arr[len+1] 생성
}

Container::~Container()
{
 delete[] arr;  // arr 메모리 삭제
}

void Container::Insert(Element data) // Data* data  // 데이터 형 포인터 data  // Data* data = new Data(1) // data 는 new Data(1)를 가리킴
{
 arr[aIndex++]=data; //arr[aIndex++] 란 방안에 data( 객체 포인터) 저장 // 포인터 = 포인터  // 옅은 복사 // 주소 값만 복사함 // 데이터는 하나 포인터가 두개
}

Element Container::Remove(int idx)
{ Element temp=arr[idx];
 for(idx;idx<aIndex;idx++)
 {
  arr[idx]= arr[idx+1];
 }
 return temp;
}

Element Container::GetItem(int idx)
{
 return arr[idx];
}

int main(void)
{
 Container ctr;

 ctr.Insert(new Data(1)); // 삽입
 ctr.Insert(new Data(2));
 ctr.Insert(new Data(3));

 cout<<"Data 저장 후 출력"<<endl;
 int num1=ctr.GetElemSum();
 for(int i=0; i<num1; i++)
  ctr.GetItem(i)->ShowData();

 Element del=ctr.Remove(1); // 객체 포인터 받음
 delete del; // 여기서 포인터 삭제 // 주소값 사라짐 // 찾을 길이 없음

 cout<<"Data 삭제 후 출력"<<endl;
 int num2=ctr.GetElemSum();
 for(int j=0; j<num2; j++)
  ctr.GetItem(j)->ShowData();

 return 0;

}

 

// 컴파일 하고 실행중에 에러 남

댓글