반응형



C++ 클래스에서  static 멤버변수를 초기화하는 방법을 다룹니다. 

아직 C++에 익숙하지 못해서 제 맘대로 바꿔보면서 감을 익히는 중입니다. 



2020. 9. 1.  최초작성



클래스에  static 변수를 추가하여 클래스를 이용하여 만들어진 모든 인스턴스가 

 static 변수를 공유하도록 만들고 싶었습니다.

모든 인스턴스가 같은 값을 가지는 멤버변수를 가지도록 하려는 겁니다. 



클래스 A에 static 멤버변수 name을 추가했습니다.

테스트 편의상 public으로 선언했습니다. 


A.h

#include <string>
#include <iostream>

class A
{
    public:
    static std::string name;
};




그리고 테스트에 사용할 새로운 파일을 만들어 static 변수를 초기화를 해보았습니다.

인스턴스를 선언하지 않고 다음처럼 직접 해당 멤버변수에 값을 넣었습니다.  


main.cpp

#include "A.h"

int main()
{
    A::name = "hello";
}



컴파일 해보니 다음과 같은 에러가 납니다. 

클래스 A에 name이 분명히 선언되어 있는데 클래스 A에서 변수 name을 못찾네요. 


main.cpp:(.rdata$.refptr._ZN1A4nameB5cxx11E[.refptr._ZN1A4nameB5cxx11E]+0x0): undefined 

reference to `A::name[abi:cxx11]'

collect2.exe: error: ld returned 1 exit status



인스턴스를 생성하여 해도 똑같은 에러가 납니다.


main.cpp

#include "A.h"

int main()
{
    A a;
    a.name = "hello";
}




검색해보니 static 멤버변수를 전역에서 초기화해주어야 한다고 합니다. 

main.cpp 파일의 전역에서 다음처럼 A클래스의 static 변수 name을 초기화해줍니다.

앞에서 살펴본 두가지 방법 모두 에러가 나지 않습니다. 


main.cpp

#include "A.h"

std::string A::name = "";

int main()
{
    A::name = "hello";
    //A a;
    //a.name = "hello";
}




클래스 A의 static 멤버변수 name을 “hello”로 초기화한 후, 이후 생성되는 클래스 A의 인스턴스 c1, c2, c3의 멤버변수 name 값을 출력해보면 값이 “hello”로  동일한 것을 확인할 수 있습니다. 

 

main.cpp

#include "A.h"

std::string A::name = "";

int main()
{
    A::name = "hello";
    //A a;
    //a.name = "hello";

    A c1;
    std::cout << c1.name << std::endl;

    A c2;
    std::cout << c2.name << std::endl;

    A c3;
    std::cout << c2.name << std::endl;
}




추가로 두 개의 클래스를 생성하여 한쪽 클래스에서 클래스 A의 static 멤버변수 name의 값을 설정하고 

다른 클래스에서 클래스 A의 static 멤버변수 name 을 출력해보았는데 정상적으로 동작합니다.

다른 클래스 내에서 생성되더라도 클래스 A의 static 멤버변수 name을 공유합니다.



문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts