서의 공간

클래스에 대해 본문

C++/정보

클래스에 대해

홍서의 2021. 2. 3. 00:56

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