ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정적 멤버 (2)
    C++ 2021. 12. 23. 13:29

    https://www.youtube.com/watch?v=ZoK_VFoycas&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=64

    1. static을 통해 객체 생성에 번호 부여

    #include <iostream>
    
    using namespace std;
    
    int idCounter = 1;
    
    class Color {
    public:
    	Color() : r(0), g(0), b(0), id(idCounter++) { }
    	Color(float r, float g, float b) : r(r), g(g), b(b), id(idCounter++) { }
    	
    	float GetR() { return r; }
    	float GetG() { return g; }
    	float GetB() { return b; }
    
    	static Color MixColors(Color a, Color b) {
    		return Color((a.r + b.r) / 2, (a.g + b.g) / 2, (a.b + b.b) / 2);
    	}
    
    	int getId() { return id; }
    
    private:
    	float r;
    	float g;
    	float b;
    
    	int id;
    };
    
    int main() {
    	Color blue(0, 0, 1);
    	Color red(1, 0, 0);
    
    	Color mix = Color::MixColors(blue, red);
    
    	cout << "mixR : " << mix.GetR() << endl << "mixG : " << mix.GetG() << endl << "mixB : " << mix.GetB() << endl;
    	cout << "blue의 Id : " << blue.getId() << endl;
    	cout << "red의 Id : " << red.getId() << endl;
    	cout << "mix의 Id : " << mix.getId() << endl;
    }

    위의 코드에서 idCounter를 전역변수로 지정하여서 id를 부여해줬다. 그러나 idCounter는 Color클래스와 밀접한 관련을 가지고 있기 때문에 Color클래스 안에 넣어주고 싶다.

     

    #include <iostream>
    
    using namespace std;
    
    class Color {
    public:
    	Color() : r(0), g(0), b(0), id(idCounter++) { }
    	Color(float r, float g, float b) : r(r), g(g), b(b), id(idCounter++) { }
    	
    	float GetR() { return r; }
    	float GetG() { return g; }
    	float GetB() { return b; }
    
    	static Color MixColors(Color a, Color b) {
    		return Color((a.r + b.r) / 2, (a.g + b.g) / 2, (a.b + b.b) / 2);
    	}
    
    	int getId() { return id; }
    
    	static int idCounter;
    private:
    	float r;
    	float g;
    	float b;
    
    	int id;
    };
    
    int Color::idCounter = 1;
    
    int main() {
    	Color blue(0, 0, 1);
    	Color red(1, 0, 0);
    
    	Color mix = Color::MixColors(blue, red);
    
    	cout << "mixR : " << mix.GetR() << endl << "mixG : " << mix.GetG() << endl << "mixB : " << mix.GetB() << endl;
    	cout << "blue의 Id : " << blue.getId() << endl;
    	cout << "red의 Id : " << red.getId() << endl;
    	cout << "mix의 Id : " << mix.getId() << endl;
    }

    따라서 idCounter를 클래스안에 집어넣고 static을 통해서 넣어주면 된다.

     

    	static int idCounter = 1;

    그리고 위와 같이 초기화를 시켜주면 구문오류가 발생한다.

    왜냐하면 idCounter는 정적멤버인데 객체가 생성 될 때 idCounter가 만들어지는 것은 이상하다.

    객체가 생성될 때마다 idCounter가 초기화되어버리면 논리적으로 이상하기 때문에 클래스 외부에 선언을 해준다.

     

    int Color::idCounter = 1;

    클래수 외부에서 이러한 방법을 통해서 초기화를 시켜주면 된다.

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

    멤버 메서드 활용하기  (0) 2021.12.23
    상수형 매개변수와 상수형 메서드  (0) 2021.12.23
    정적 멤버 (1)  (0) 2021.12.23
    생성자의 다양한 사용 방법  (0) 2021.12.23
    객체의 생성과 소멸  (0) 2021.12.21
Designed by Tistory.