2016-10-26 2 views
0

나는 개인 데이터 멤버의 많은 CObject의 이름을거야 클래스가 ..초기화 중 클래스

class CObject 
{ 
    private: 
    int a, b, c, d, e, f, g, h, i; 
    string j; 
    ...More data types etc 
}; 

그리고 반복적으로 개체 ..이 회원을 찾는 초기화시 파일을 구문 분석 다른 클래스 클래스는 라이브러리에서 제공하는 가상 클래스를 만족합니다.

class CParser 
{ 
    public: 
    void beginParsingObject() 
    { 
     //etc 
    } 

    void parseObjectMembers(string name, int a) 
    { 
     //Found a member variable of the object! 
    } 

    void finishParsingObject() 
    { 
     //Finish up parsing the object 
    } 
}; 

그래서 "parseObjectMembers"는 CObject 클래스에 멤버 변수가 여러 번 호출됩니다.

CObject 클래스는 파서가 데이터 파일 항목에서 다음 멤버 변수를 찾으면 멤버 변수를 채 웁니다. 여기

내 당황입니다 :

어떤 데이터를 읽을 때 CObject에서 멤버 변수를 설정하는 좋은 방법이 될 것입니다?

- 생성자를 사용하면 모든 값을 캐싱하고 객체 파싱 완료시 객체를 생성하는 것을 의미합니다. 많은 부분이 만족스럽지 않고 파서가 꽤 일반화되기를 바랍니다.

- CObject 클래스에서 getters와 setters를 사용하면 모든 멤버 변수가 필요하지 않거나 필요없는 모든 것에 노출됩니다.

초기화 기능을 사용하면 문제가 없지만 그 기능에 대한 액세스 권한이 필요하지 않습니다. 친구 기능일까요?

어떤 아이디어라도 감사 드리며 내가 할 수있는 부분을 명확히하겠습니다. 죄송합니다. 코드가 애매하고 매우 매끄럽지는 않지만, 문제의 핵심을보기에 충분합니다.

고마워요.

답변

0

당신이 묘사 한 것은 직렬화/비 직렬화 인 것 같습니다. (XML) 구성 파일에서 오브젝트 데이터를 백업/검색하는 것은 매우 일반적입니다. 어쩌면 좋은 시작은 Boost Serialization Tutorial 일 것입니다.

귀하의 질문에 대한 대답은 "친구의 기능/클래스 자체의 클래스 사용"일 수 있습니다.

+0

예, 개념에 이름을 붙여 주셔서 감사합니다. 이것은 참으로 직렬화입니다. 그것은 올바른 방향으로 나를 돕는 도움이 될 것입니다. – SomeGuy

+0

예 (오른쪽)는 중요합니다. 또한 게시물의 제목에 "직렬화"를 추가하십시오. 또 다른 예는이 게시물이 C++ 일지라도 언급 한 C#입니다. 나는 기본적으로 getter와 setter 및 매개 변수없는 생성자를 사용하여 public "Properties"(메서드 호출을 통해 액세스하는 필드)가 필요한 XMLSerializer의 메커니즘을 사용했습니다. [Serializable에 관한 질문] (http://stackoverflow.com/questions/2982376/why-is-serializable-attribute-required-for-an-object-to-be-serialized)에서 정보를 찾으십시오. – NGI

+0

XML 파일을 언급했지만 바이너리 포맷터/백업 파일도 있습니다. 그러나 나는 (내가 아는 바에 따르면) 대부분의 경우 한 인스턴스의 데이터가 연속적이며 파일 전체에 퍼지지 않을 것이라고 가정합니다. 각 데이터 멤버가이 멤버가 속한 인스턴스를 다시 지정해야합니다. – NGI