2013-05-08 2 views
0

다음과 같은 문제가 있습니다.컴파일시에 생성 된 객체를 결정하십시오.

구성 요소 A가 있습니다.이 구성 요소에는 B, C, D 하위 구성 요소가 있습니다. cmake를 사용하여 B 또는 C 구성 요소가 아닌 건물을 만들고 있습니다. 현재 플랫폼 구성에 따라 다릅니다. 내 cmake 시스템은 주어진 cmake 실행에 사용 된 구성 요소 만 연결하기위한 실행 가능 메이크 파일 (A 구성 요소 용)을 만들고 있습니다. 구성 요소 B가 빌드 된 경우, 그렇지 않은 경우 실행 가능 파일에 추가됩니다. 링크되지 않습니다. 다른 것과 동일합니다 - C, D.

이러한 모든 B, C, D 구성 요소는 A 구성 요소에서 사용되는 인터페이스의 일부 구현을 제공합니다. 이 구성 요소는 B, C, D에 의해 생성 된 객체를 관리하고 적절한 시점에 적절한 객체를 사용하여 객체를지도에서 유지해야합니다.

질문 :

나는 그것이 링크와 함께 지금 동일하게 자동으로 인터페이스를 구현하는 객체를 추가하는 몇 가지 간단하고 신뢰할 수있는 메커니즘을 달성하고자하는 - 내장 된 전용 모듈입니다 링크. 이러한 객체들과 마찬가지로 - 컴파일 된 경우에만 A 컴포넌트에 등록되도록하고 싶습니다.

설명하기가 어렵습니다. 아이디어는 쉽습니다 - 컴파일 타임에 해당 오브젝트의 맵을 빌드하십시오. 컴파일 된 컴포넌트 만이 객체를이 맵에 전달해야합니다.

+1

makefile/cmake 시스템에서 설정 한 전 처리기 지시문을 사용하여이 문제를 해결할 수 있습니다. 예를 들어, 구성 요소 B가 컴파일되고 A 컴파일시 포함되어야하는 경우 '#ifdef COMPILED_B'와 같은 지시문을 사용하여 필요할 때 A의 B에 대한 지원을 포함 할 수 있습니다. –

+0

예, 가능하지만 소스 코드에서 #ifdef를 사용하지 않으려합니다. 나는 다른 사람들이 어떻게 좀 더 정교한 방법으로 그것을하고 있는지 알고 싶었다. – user2301299

답변

1

Objective-C 및 Smalltalk에서 메서드를 구현하는 방법과 비슷한 디자인을 사용했습니다.

C++에서 메서드 == 멤버 함수이므로 컴파일시 정의해야합니다. 따라서 인터페이스가 전처리 기와 같은 메커니즘으로 확장 될 수 있지만 동일한 구성이 클래스의 모든 클라이언트에도 영향을 주어야하며 그렇지 않으면 연결되지 않습니다.

그래서 메시지 전달 시스템을 사용하여 개체의 메서드를 호출합니다. 따라서 A가 기본 클래스이고 C 및 D에서 컴파일되지만 B는 컴파일하지 않으면 A의 메시지 프로세서는 C 및 D로 핸들러가있는 메시지에만 응답합니다.

이 유형의 디자인에서는 어떤 종류의 메시징 시스템. Google Protocol Buffers 및 Apache Thrift와 같은 수많은 기존 시스템이 있습니다. 필자는 대부분의 기존 시스템이 허용하는 것보다 더 많은 런타임 구성 가능성을 원했기 때문에 설계를 선택했습니다 (많은 메시징 시스템에 IDL 컴파일러가 관련되어 있음).

그러나 C++이 일반적으로 허용하는 혼합 패러다임 언어보다 OO 영역에 더 가까워졌습니다.

+0

그래서 컴파일 된 (C, D) 일부 전역 메시지 처리기에 대한 처리기로 등록하고 있던 전역 범위 (프로세스 시작시 초기화 됨) 개체가 있어야하는 경우 귀하의 경우 구성 요소에 있습니까? 그들은 그들의 생성자로부터 그것을하고 있었습니까? – user2301299

+1

A의 생성자는 공유 객체의 경로를 검색합니다. 존재한다면, 그것들을로드하고 이니셜 라이저 함수 (모든 구성 요소의 표준 이름)를 호출합니다. 이니셜 라이저는 메서드 이름과 관련 주소를 등록하여 메시징 시스템에 기능을 주입합니다. 매개 변수는 메시지의 일부로 키 - 값 쌍으로 전달됩니다. 새 구성 요소의 메시지 API를 쿼리하여 명령, 매개 변수, 단 위, 제한/범위 및 설명 목록을 얻을 수 있습니다.정교한면에는 조금 있지만 대형 분산 시스템을 손쉽게 유지 보수하는 것이 목표입니다. –

+0

한 가지 구체적인 예에서 생성자는이 프로젝트의 구성 요소 디렉토리에 대한 경로를 나타내는 문자열을 전달받습니다. 그런 다음 OS의 API는 공유 객체 (Windows 빌드 용 DLL)를 찾아로드하고 코드에 동적으로 링크하는 데 사용됩니다. 객체는 메시지 처리기와 메시징 시스템에 기능을 주입 할 수있는 init 함수로 구현 된 기능을 포함합니다. 메시지 클라이언트에 대한 포인터가 init 함수에 전달되어 등록 호출을 할 수 있습니다. –

관련 문제