서의 공간
클래스에 대해 본문
1. 내부 싱글톤 클래스
#include <iostream>
using namespace std;
/*
내부 private한 싱글톤 클래스의 사용방법임.
chili window클래스의 핵심이므로 계속 참고할 것.
*/
class OuterClass
{
public:
class InnerClass
{
public:
InnerClass() {
cout << "OuterClass의 public 내부클래스 InnerClass의 기본 생성자" << endl;
}
};
private:
class InnerSingletonClass
{
public:
static int GetMemberValue() { return mValue; }
private:
InnerSingletonClass() {
cout << "OuterClass의 private 내부클래스(싱글톤) InnerSingletonClass의 기본 생성자" << endl;
}
static InnerSingletonClass instance;
static constexpr int mValue = 10;
};
public:
OuterClass() {
cout << "InnerSingletonClass의 GetMemerValue(): " << InnerSingletonClass::GetMemberValue() << endl;;
cout << "OuterClass의 기본 생성자" << endl;
}
};
OuterClass::InnerSingletonClass OuterClass::InnerSingletonClass::instance;
int main()
{
OuterClass test;
return 0;
}
실행결과:
OuterClass의 private 내부클래스(싱글톤) InnerSingletonClass의 기본 생성자
InnerSingletonClass의 GetMemerValue(): 10
OuterClass의 기본 생성자
2. 클래스의 멤버가 다른 클래스일 때 생성 순서
#include <iostream>
using namespace std;
/*
클래스의 멤버변수가 다른 클래스라면
클래스를 생성할 때 클래스와 다른 클래스의 생성 순서를 나타낸다.
자기보다 먼저 스택 변수인 다른 클래스를 먼저 생성하는 것을 알 수 있다.
*/
class SecondClass
{
public:
SecondClass() {
cout << "SecondClass 기본 생성자" << endl;
}
};
class FirstClass
{
public:
FirstClass() {
cout << "FirstClass 기본 생성자" << endl;
}
private:
SecondClass second;
};
int main()
{
FirstClass first;
return 0;
}
실행결과:
SecondClass 기본 생성자
FirstClass 기본 생성자
3. 1번과 2번을 합친 예제이다. 인스턴스 생성 순서에 주목한다.
#include <iostream>
using namespace std;
/*
클래스 생성 순서는
1. 내부 싱글톤 클래스
2. 스택 멤버 클래스
3. 자기 자신
*/
class SecondClass
{
public:
SecondClass() { cout << "SecondClass 기본 생성자" << endl; }
};
class FirstClass
{
public:
class InnerClass
{
public:
InnerClass() {
cout << "FirstClass의 public 내부클래스 InnerClass의 기본 생성자" << endl;
}
};
private:
class InnerSingletoneClass
{
public:
static int GetValue() { return mValue; }
private:
InnerSingletoneClass() {
cout << "FirstClass의 private 내부클래스(싱글톤) InnerSingletoneClass의 기본 생성자" << endl;
}
static InnerSingletoneClass instance;
static constexpr int mValue = 10;
};
public:
FirstClass() {
cout << "FirstClass의 기본 생성자" << endl;
}
private:
SecondClass second;
};
FirstClass::InnerSingletoneClass FirstClass::InnerSingletoneClass::InnerSingletoneClass::instance;
int main()
{
FirstClass first;
return 0;
}
실행결과:
FirstClass의 private 내부클래스(싱글톤) InnerSingletoneClass의 기본 생성자
SecondClass 기본 생성자
FirstClass의 기본 생성자
4. 초기화 리스트에서의 생성자와 스택 변수에서의 기본 생성자
#include <iostream>
using namespace std;
/*
멤버 변수가 먼저냐 생성자 초기화 리스트가 먼저냐
FirstClass의 클래스 멤버 변수 second와
FirstClass의 생성자 초기화 리스트에서의 변수 second의 초기화에서
어떻게 SecondClass가 생성되는지 보여주는 예제이다.
*/
class SecondClass
{
public:
SecondClass() { cout << "SecondClass 기본 생성자" << endl; }
SecondClass(int num) {
cout << "SecondClass(int num) 생성자" << endl;
}
};
class FirstClass
{
public:
FirstClass() : second(5) {
cout << "FirstClass 기본 생성자" << endl;
}
private:
SecondClass second;
};
int main()
{
FirstClass first;
return 0;
}
실행결과:
SecondClass(int num) 생성자
FirstClass 기본 생성자
5. 템플릿 상속에서 자식 클래스가 부모 클래스의 멤버 변수에 접근 할 때
#include <iostream>
using namespace std;
/*
템플릿 클래스 상속 관련하여
자식클래스에서 (자식과 부모의 템플릿 타입이 항상 일치하다면)
부모클래스의 변수를 사용하고자 using 키워드를 쓰는 예제이다.
*/
template<typename T>
class Parent
{
public:
Parent() { cout << "Parent 기본 생성자" << endl; }
protected:
T a = 5;
};
// 1번 방법: a의 변수 앞에 부모의 네임 스페이스를 명시한다.
template<typename T>
class Child : public Parent<T>
{
public:
Child() { cout << "Child 기본 생성자" << endl; }
void ParentValue() { cout << "Parent의 멤버 변수 a = " << Parent<T>::a << endl; }
};
// 2번 방법: using 키워드를 사용한다.
template<typename T>
class Child : public Parent<T>
{
using Parent<T>::a;
public:
Child() { cout << "Child 기본 생성자" << endl; }
void ParentValue() { cout << "Parent의 멤버 변수 a = " << a << endl; }
};
int main()
{
Child<int> child;
child.ParentValue();
return 0;
}
실행결과:
Parent 기본 생성자
Child 기본 생성자
Parent의 멤버 변수 a = 5
'C++ > 정보' 카테고리의 다른 글
상호참조와 종속성을 최소화하는 방법 (0) | 2021.05.17 |
---|---|
optional 예제 (0) | 2021.02.03 |
c++ 함수안에 함수 정의 (0) | 2021.01.19 |
std::vector::erase(), std::vector::clear(), std::remove() (0) | 2020.12.16 |
C++용 XML 설명서 (0) | 2020.12.13 |
Comments