본문 바로가기

[C++]정적멤버 함수에서 객체 생성하기

반응형

생성자를 public 에 놓아야 main()함수에서 호출할 수 있다. 하지만 private에 놓으면 호출할 수도 없고 객체를 생성할 수도 없다.

   

정적 멤버함수에서 객체를 생성하는 예제.

중요점은 동적 멤버함수의 활용.

학생의 정보를 가진 Stdent 클래스가 등장. 달라진 점이 있다면 생성자가 Private로 되어 있다는 점이다. 즉, 클래스의 외부에서 객체를 생성하는 것은 불가능하다. 하지만 멤버라면 가능하다.

정적멤버 함수에서 객체를 동적으로 생성해서 그 주소를 반환하게 만들었음.

   

#include <iostream>

#include <string>

using namespace std;

   

// 학생 클래스

class Student

{

public:

  string name;    // 이름

  int    sNo;  // 학번

   

  void Print();

   

private:

  // 생성자

  Student(const string& name_arg, int stdNumber);

   

public:

  // 정적 멤버

  static int studentNumber;//정적멤버 변수를 정의하고 있다.정적멤버함수에서 학생객체를 생성할

  static Student* CreateStudent(const string& name_arg);//학번을 자동으로 부여하기 위해 사용.

};

   

int Student::studentNumber = 0;

   

Student* Student::CreateStudent(const string& name_arg)

{

  // 학생 객체를 생성한다.

  Student* p = new Student( name_arg, studentNumber++);

   

  // 새로 생성된 학생 객체 반환

  return p;

}

   

Student::Student(const string& name_arg, int stdNumber)//정적멤버 함수를 정의

{

  name = name_arg;

  sNo = stdNumber;

}

   

void Student::Print()

{

  cout << "{Name = " << name << ", Std. Num. = " << sNo << "}\n";

}

   

int main()

{

  // 학생 객체를 세 개 생성한다. 객체를 생성하기 위해서 정적 멤버 함수를 호출한다.

  Student* p1, * p2, *p3;

  p1 = Student::CreateStudent( "이계희");

  p2 = Student::CreateStudent( "이춘훈");

  p3 = Student::CreateStudent( "윤수연");

   

  // 생성된 학생의 정보를 출력한다.

  p1->Print();

  p2->Print();

  p3->Print();

   

  // 객체들이 동적으로 생성되었으므로

  // 해제해줄 필요가 있다.

  delete p1;

  delete p2;

  delete p3;

  p1 = p2 = p3 = 0;

   

  return 0;

}

   

   

생성자가 private인 경우에도 정적멤버 함수에서는 객체를 생성할 수 있다.

이렇게 하려면 객체를 동적으로 생성해서 그 주소를 반환하는 수 밖에 없다.

   

   

정적멤버함수도 멤버라는 점.

private 설정한 것은 클래스의 외부에서 접근할 수 없다는 뜻이지 내부에서도 접근할 수 없다는 뜻은 아니다.

생성자는 private로 해두고 정적 멤버 함수를 통해서만 객체를 생성할 수 있게 하는 벙법은 실제로 종종 사용된다.

   

   

반응형
-->