'포인터배열'에 해당되는 글 1건

  1. 2012.05.21 객체 배열 & 객체 포인터 배열

객체 배열


: 객체 배열 및 객체 포인터 배열은 C언어의 구조체 배열과 구조체 포이터 배열과 유사하다.


객체 기반의 배열은 다음의 형태로 선언한다(Simple이 클래스 이름).

Simple arr[10];


이를 동적으로 할당하는 경우에는 다음의 형태로 선언한다.

Simple * ptrArr = new Simple[10];


이러한 형태로 배열을 선언하면, 열 개의 Simple 객체가 모여서 배열을 구성하는 형태가 된다. 이렇듯 구조체 배열의 선언과 차이가 없다.

하지만 배열을 선언하는 경우에도 생성자는 호출이 된다. 단, 배열의 선언과정에서는 호출할 생성자를 별도로 명시하지 못한다(생성자에 인자를 전달하지 못한다). 즉, 위의 형태로 배열이 생성되려면 다음 형태의 생성자가 반드시 정의되어 있어야 한다.

Simple(void) {...}


그리고 배열 선언 이후에 각각의 요소를 원하는 값으로 초기화시키길 원한다면, 일일이 초기화의 과정을 별도로 거쳐야 한다.



객체 배열의 예제

#include <iostream>

#include <cstring>

using namespace std;


class Person

{

private:

char * name;

int age;


public:

Person(char* myname, int myage)             //생성자

:age(myage)

{

int len = strlen(myname);

name = new char[len];

strcpy(name, myname);

}

Person() //생성자. 배열 생성시 필요한 생성자를 추가하였다.

{

name = NULL;

age = 0;

cout<<"called Person()"<<endl;

}

void SetPersonInfo(char * myname, int myage)

{

name = myname;

age = myage;

}

void ShowPersonInfo() const

{

cout<<"이름: "<<name<<", "<<"나이: "<<age<<endl;

}

~Person() //소멸자

{

delete []name;

cout<<"called Destructor!"<<endl;

}

};


int main(void)

{

Person pArr[3];             //class Person 3개를 가지고있는 배열.

char nameStr[100];

char * strPtr;

int age;

int len;


for(int i=0; i<3; i++)

{

cout<<"이름: ";

cin>>nameStr;

cout<<"나이: ";

cin>>age;

len = strlen(nameStr)+1;

strPtr = new char[len];

strcpy(strPtr, nameStr);

pArr[i].SetPersonInfo(strPtr, age);

}


for(int i=0; i<3; i++)

pArr[i].ShowPersonInfo();


return 0;

}


실행결과




객체 배열 생성시 void형 생성자가 호출됨을 확인할 수 있다. 그리고 배열 소멸시에도 그 배열을 구성하는 객체의 소멸자가 호출됨을 확인할 수 있다.


-----------------------------------------------------------------------------------


객체 포인터 배열


: 객체 배열이 객체로 이뤄진 배열이라면, 객체 포인터 배열은 객체의 주소 값 저장이 가능한 포인터 변수로 이뤄진 배열이다.


#include <iostream>

#include <cstring>

using namespace std;


class Person

{

private:

char * name;

int age;


public:

Person(char* myname, int myage)             //생성자

:age(myage)

{

int len = strlen(myname)+1;

name = new char[len];

strcpy(name, myname);

}

void ShowPersonInfo() const

{

cout<<"이름: "<<name<<", "<<"나이: "<<age<<endl;

}

~Person() //소멸자

{

delete []name;

cout<<"called Destructor!"<<endl;

}

};


int main(void)

{

Person* pArr[3];                 //class Person 가리킬 수 있는 객체 포인트 배열.

char nameStr[100];

int age;


for(int i=0; i<3; i++)

{

cout<<"이름: ";

cin>>nameStr;

cout<<"나이: ";

cin>>age;

pArr[i] = new Person(nameStr, age);    //객체를 생성해서, 이 객체의 주소 값을 배열에 저장하고 있다.

}


for(int i=0; i<3; i++)

{

pArr[i]->ShowPersonInfo();

delete pArr[i]; //new연산을 진행하였으니 delete연산 진행.

}


return 0;

}


실행결과




※ 객체를 저장할 때에는 위의 예제에서 보인 두 가지 방법 중 하나를 택해야 한다. 즉, 저장의 대상을 객체로 하느냐, 객체의 주소 값으로 하느냐를 결정해야 한다.


'Programming > C++' 카테고리의 다른 글

복사 생성자(Copy Constructor)  (0) 2012.05.22
this 포인터  (0) 2012.05.21
생성자 & 소멸자를 이용한 예제  (0) 2012.05.21
생성자를 이용한 예제.  (0) 2012.05.21
소멸자(Destructor)  (0) 2012.05.20
Posted by scii
: