2012-11-28 4 views
0

기본적으로 원하는 일부 데이터 유형에 대한 내부 구조를 만들려고합니다. 이러한 데이터 유형은 내 프로그램 (기본적으로 대용량 데이터베이스이지만)을 사용하도록 설정하는 번거 로움을 피하기 위해 대량의 정보를 보유 할 것이며 직렬화/비 직렬화 될 것입니다.텍스트 파일/XML 파일에서 C++ 클래스 만들기

하지만이 클래스/구조체는 텍스트 파일/ml 파일의 레이아웃에서 즉석에서 만들고 싶습니다. 예를 들어 :

container Music 
field string name 
field largenumber filesize 
end container 

이것은 매우 기본적인 예이다 : 상기 '컨테이너'데이터 유형 (클래스 또는 구조체) 것에서 '필드는'.. 문자열 인 상태 (STL과 문자열 변수를 나타낸다 , 큰 숫자는 부호없는 정수 또는 somesuch입니다. 예, 올바른 구문을 검사하는 C++ 파서 (컴파일러의 경우)와 같은 것을 원한다는 것을 알고 있습니다.

기본적으로 내 사용자는 자신의 데이터 유형 (필드 추가/필드 제거/자체 구조 만들기)을 수행 한 다음 내 프로그램에 영구히 보관하십시오.

이 작업을 수행하는 동안 serialize/unserialize를 수행해야합니다. 직렬화 된 데이터로 마지막으로 생성 된 클래스/구조체 텍스트 파일도 저장해야합니다. 그러면 데이터 정렬을 취소 할 때 데이터 유형을 다시 만들 수 있습니다.

누구든지이 작업을 수행하는 방법을 알고 있거나 내 디자인을 더 잘 구현할 것을 제안합니까?

P. 분명히이 정보는 컴파일 타임이 아닌 런타임에 생성되어야합니다.

+1

더 명확 할 수 있습니까? 예를 들어 이러한 데이터를 수업으로 보는 데 문제가 있습니까? 즉, 가변 개수의 변수 유형 요소를 포함 할 수있는 클래스를 작성할 수 있습니까? 아니면 그것을 연재하면서 문제가 무엇입니까? 아니면 일반적으로 더 나은 해결책이 있는지 묻고 있습니까? – Shahbaz

+0

귀하의 태평양 표준시입니다. 전혀 명백하지 않다. 런타임시 결과 C++ 코드를 어떻게 컴파일합니까? – Cameron

+0

런타임에 C++ 프로그램에서 새 유형을 만들 수 없습니다. 사용자가 유형을 표현하거나 기존 언어를 재사용 할 수있는 언어를 작성하여 프로그램에 구현해야합니다. 이 언어는 C++과 유사 할 필요는 없습니다. 여기에는 두 가지 질문이 있습니다 : (1) 사용하는 언어의 종류와 (2) 구현 방법. 아니, 세 번이나해라. (3) 실제로 DBMS가 필요하지 않습니까? –

답변

1

XML에서 개체로 변환하는 경우 실제로보고있는 것은 SOAP의 일부입니다. RapidXML을 선호하지만 다른 XML 파서를 사용하여 객체를 만들고 읽을 수 있습니다.

텍스트 파일을 사용하면 텍스트 파일을 올바르게 처리하여 올바른 형식과 정의를 예상하는 고유 파서를 작성한 다음 이에 따라 개체를 생성해야 할 수 있습니다.

공통 인터페이스가 존재하지 않는 한, 동적으로 개체를 만들고 값으로 채우는 것은 쉽지 않습니다. 이 유형은 동적, 왜 간단한 스크립트 언어로 볼 (또는 DSL 자신을?)하지

+0

위의 옵션이 작동하지 않으면이 부분을 살펴볼 것입니다. yoru 답장을 보내 주셔서 감사합니다! – user1853098

1

당신이 제안, 나는이 것 당신이 사용자가 "CREATE"원하는 말했다 이후 사이드 참고로

, XML 구문 분석기를 작성하고 데이터 유형 정의가 파일에 있어야합니다. 이렇게하면 구문 분석이 매우 쉽습니다 (모든 XML 읽기 라이브러리 사용). 당신은 런타임에 데이터 유형을 만들 때 필요한 모든입니다 : 클래스 컨테이너하고 이름, 유형을 저장할 수있는 클래스 필드

당신은 전처리 XML 파일, 함수를 생성하는 것 물론

Field newfield1 (name, type, whatever); 
Field newfield2 (name2, type2, whatever2); 
... 
Container newContainer; 
newContainer.addField(newfield1); 
newContainer.addField(newfield2); 
... 

, 당신은 그것보다 훨씬 더 나은 코드를 구성 할 수 있지만, 그냥 아이디어를 제공 할 수있다 : 일반적으로처럼 보이는, 당신의 일부 데이터 구조를 채 웁니다. 먼저 XML로 데이터 유형을 기록하고 XML을 사전 처리하고 "런타임".cpp 파일을 생성하여 동적 유형을 작성한 다음이를 프로젝트에 포함시킨 다음 필요에 따라 유형을 사용할 수 있습니다.

미리 알려지지 않은 다른 유형의 필드를 만들려면 boost :: variant를 사용하고 XML에서 유형 목록을 생성 할 수 있습니다.또한 필드 당 하나의 typedef를 생성하여 나중에 부스트를 사용할 때 적절한 유형이 사용되도록 할 수도 있습니다. <>을 얻으십시오.

+0

우수! 네, 이것은 제가하고 싶은 것과 똑같은 것 같습니다.이 개념은 컴파일러가 정보를 파싱하는 것처럼 보였습니다. 정말 고마워! – user1853098

+0

일부 독서를 한 후에, 나는 boost :: any 클래스를 발견했습니다. 잠재적으로, 나는 boost :: any variables의 맵을 가질 수 있습니다. 사용자가 데이터 유형 (일련의 미리 정의 된 유형 중 하나)을 지정하는 한 XML로 파일에서 데이터를 읽고 적절한 유형으로 변환하기가 쉽습니다. 변형을 사용하는 것이이 방법과 비교하여 어떻게 작동하는지 확신 할 수 없습니다. 설명해 주시겠습니까? – user1853098

+0

그래, 사용 방법에 따라 boost :: any도 동작 할 것이다. 나는 boost :: variant를 더 좋아한다. 왜냐하면 런타임 검사 대신에 정적 검사를 제공하기 때문이다. 그러나 그것은 맛의 문제이다. [부스트 비교 페이지] (http://www.boost.org/doc/libs/1_52_0/doc/html/variant/misc.html)에서 가장 적합한 것을 결정하십시오. – Mic

관련 문제