2012-09-30 2 views
3

데이터 묶음을 포함하고있는 파일에서 초기화되고 데이터를 읽고이를 const 데이터 멤버로 저장하는 C++ 클래스를 갖고 싶습니다. 내가 현재 무엇을여러 데이터 멤버의 const 초기화

이 그들이 실제 초기화 단계 이후에 설정되어 있기 때문에 datumX의 더 이상 const을 표시 할 수없는 단점이있다

MyClass(const std::string & fileName): 
datum0(), 
datum1(), 
datum2() 
{ 
    this->read(fileName); 
    // read() sets all datumX data members. 
} 

입니다.

여기서 좋은 패턴은 무엇입니까?

+0

'const' 데이터 멤버는 거의 C++에서는 좋은 아이디어가 아닙니다. 예를 들어,'MyClass' 객체를'std :: vector'에 넣는 것을 막을 것입니다. – fredoverflow

답변

1

datumX 멤버 집합 대신 struct에서 file을 사용하여 생성자를 사용합니다. 당신이 말할 수있는 지금

struct MyClass 
{ 
    int const a; 
    int const b; 

    MyClass(int a_, int b_) : a(a_), b(b_) { } 
}; 

MyClass readMyClass(std::istream & is) 
{ 
    int a, b; 

    // ... 

    return MyClass(a, b); 
} 

:

class MyClass { 
    ... 
    struct MyData { 
    MyData(const string& filename) { read(filename); } 
    void read(const string& filename); 
    int datum1; 
    int datum2; 
    ... 
    }; 
    const MyData myData; 
    MyClass(const string& filename) : myData(filename) {} 
}; 
+1

도움이되지 않습니다. 'MyClass' 생성자는'myData.read'를 호출하여'datum1' 등을 설정해야합니다. 이것은'MyData :: read'가'const' 일 필요가 있거나'myData'가'const'가 아니어야 함을 의미합니다. 또한,'filename'은 아마도 MyData :: MyData' 또는'MyData :: read' 매개 변수 중 하나 일뿐입니다. – Fraser

+0

@Fraser - MyClass는 read()를 호출하지 않지만 MyData는 read()를 호출합니다. 나는 그것이 명백하다는 것을 생각했다 - 다만 그것을 명확하게하기 위하여 개정했다. 이것이 (-1)의 이유입니까? – PiotrNycz

+0

예. 그것은 분명하지 않았다. 편집 이후'read' private ;-) -1이 제거 된 경우라면됩니다. – Fraser

2

별도의 분석 및 건설 :

std::ifstream is("data.bin"); 
MyClass mc = readMyClass(is); 

또한 독자 기능 A를 할 수 있습니다 그리고이 구조체 CONST 데이터 클래스의 구성원으로 만들 원한다면 static 클래스 멤버 함수와 생성자 private.

관련 문제