일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- docker
- vim
- C언어 포인터
- 포인터
- 유니티
- 다트 언어
- c#
- 도커
- Python
- Flutter
- github
- 구조체
- Houdini
- c# 윈폼
- 플러터
- Algorithm
- Unity
- jupyter
- c# winform
- c# 추상 클래스
- dart 언어
- C# delegate
- Data Structure
- C++
- jupyter lab
- HTML
- 깃
- git
- gitlab
- c언어
Archives
- Today
- Total
nomad-programmer
[Programming/C++] 정적 멤버 함수에서 객체 생성 본문
다음 예제에서 유심히 봐야할 것은 생성자가 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<<", "<<"Number = "<<sNo<<endl;
}
int main(int argc, const char * argv[]) {
// 학생 객체 세 개 생성
Student* p1, * p2, * p3;
p1 = Student::CreateStudent("aaa");
p2 = Student::CreateStudent("bbb");
p3 = Student::CreateStudent("ccc");
// 생성한 학생 정보 출력
p1->Print();
p2->Print();
p3->Print();
// 객체들을 동적 생성했으므로 해제해줘야 한다.
delete p1;
delete p2;
delete p3;
p1 = p2 = p3 = nullptr;
return 0;
}
// 결과
Name = aaa, Number = 0
Name = bbb, Number = 1
Name = ccc, Number = 2
이 예제에서 중요한 것은 다음의 두 가지다.
- 생성자가 private인 경우에도 정적 멤버 함수에서는 객체를 생성할 수 있다.
- 이렇게 하려면 객체를 동적으로 생성해서 그 주소를 반환하는 수밖에 없다.
첫 번째는 정적 멤버 함수도 '멤버'라는 점에서 볼 때 쉽게 수긍할 수 있다. private로 설정한 것은 클래스의 외부에서 접근할 수 없다는 뜻이지 내부에서도 접근할 수 없다는 뜻은 아니기 때문이다.
두 번째는 바꿔 말해서 "정적으로 객체를 할당하는 방법은 사용할 수 없다"는 것이다. 정적 멤버 함수 안에서 객체를 정의했다면, 함수가 종료되면서 그 객체도 같이 소멸될 것이기 때문이다. 그래서 동적으로 할당한 다음에 그 주소를 반환하는 방법을 사용해야 하는 것이다.
이렇게 생성자가 private로 해두고 정적 멤버 함수를 통해서만 객체를 생성할 수 있게 하는 방법은 종종 사용된다. 예를 들면 "싱글턴 패턴"이다.
'Programming > C++' 카테고리의 다른 글
[Programming/C++] C++ Standard Library (aka. STL) (0) | 2023.01.19 |
---|---|
[Programming/C++] 클래스에 넣을 수 있는 것들 (0) | 2023.01.17 |
[Programming/C++] virtual, override, final 키워드 (0) | 2023.01.16 |
[Programming/C++] 멤버 함수에 대한 포인터 (0) | 2023.01.16 |
[Programming/C++] const 함수 (0) | 2023.01.16 |
Comments