#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;
}
// 컴파일 하고 실행중에 에러 남
'C++ > 열혈 C++' 카테고리의 다른 글
열혈 C++ opp8 AccManager.h (0) | 2018.04.09 |
---|---|
열혈 C++ oop8 main.cpp (0) | 2018.04.09 |
열혈 C++ 객체를 저장하는 배열 클래스 // []연산자 오버로딩 (0) | 2018.04.09 |
열혈 C++ 연습문제 10-2(cin 객체 <<연산자 오버로딩) (0) | 2018.04.08 |
열혈 C++ 연습문제 10-1-3(+=연산자 오버로딩) (0) | 2018.04.08 |
댓글