[완료]C++에서 static 멤버 변수를 함수로 초기화 해야 하는 경우, 어떻게 하면 좋을까요?
글쓴이: bluekyu / 작성시간: 수, 2012/07/04 - 5:45오후
데이터 구조가 특이해서 어떤 형식으로 객체를 만드는 것이 좋을 지 감이 안 잡혀서 질문을 올려봅니다.
아주 간단한 구조로 표현하면 아래와 같이 되어 있습니다.
struct A { static const int list[10]; };
그런데 list가 복잡한 값을 가져서 여러 계산을 거쳐서 초기화 되어야 합니다. 그리고 A는 여러 개가 생성될 수 있습니다.
이를 해결하는 방식으로,
1. 초기화를 확인하는 변수를 하나 두고, A 객체를 처음 생성하면 생성자가 list를 초기화 합니다. 그리고 다른 A 객체가 생성되면 이미 초기화 되었으므로 다시 초기화 하지 않습니다.
2. 아래와 같이 객체를 중첩시키는 방식도 생각해봤습니다.
struct A { private: struct B { int list[10]; B(void) { for (int i = 0; i < 10; i++) list[i] = i * i; } }; public: static const B index; }; const A::B A::index;
두 경우 모두 쓸 수는 있지만 더 나은 방식이 있을 것 같아서 질문을 드려봅니다. 이러한 데이터 구조가 있을 경우 어떻게 처리하는 것이 적절할까요?
Forums:
어느게 더 나은지는 잘 모르겠네요. 저라면 다음과
어느게 더 나은지는 잘 모르겠네요.
저라면 다음과 같이 할 것같습니다.
// .hpp
struct A {
static const int *const list;
};
// .cpp
static const int *getInitializedList() {
static int list[10];
// .. initializing
return list;
}
const int *const A::list = getInitializedList();
배열을 쓰셨길래 배열로 했지만 정말로 저라면 배열도 안쓰고 벡터를 썼을것 같습니다.
그리고 저 스태틱 멤버가 중요한 역할을 한다면 싱글톤으로 빼버릴것 같습니다.
답변 감사합니다. 결국 Null 포인터 여부를
답변 감사합니다.
결국 Null 포인터 여부를 가지고 생성자에서 해결을 했습니다.
class 보다는 struct 형식에 가깝다보니까, 멤버를 private로 처리하지 않아서 문제가 더 복잡해졌네요.
/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/
댓글 달기