2011-01-07 4 views
1

현재 우리는 tcp/ip, udp/ip, usb 등 코어에 통신 형태를 제공하는 서비스 플러그인을 허용하는 코드 본문을 가지고 있습니다.이 서비스 플러그인은 피드백 처리기 클래스 인스턴스를 추가 처리를 위해 코어에 추가합니다.코드 유닛 포함을 피하기위한 방법으로 C++ 가상 키워드

현재 구현에서 서비스 프로젝트 (dlopen과 friends를 통해 코어에서 런타임에 가져온 별도의 동적 링크 라이브러리 임)는 코어 소스 코드에있는 notifier.cpp 파일에 대해 컴파일됩니다 (개별 프로젝트). 이것에 의해, 통지 메소드의 구현에 액세스 할 수있게됩니다. 이것은 완벽하게 불만을 없애줍니다.

두 가지 대체 옵션 : 1. 알리미 메서드 구현을 헤더 파일에 넣습니다. 2. 런타임까지 알리미 메서드 virtual 및 지연 바인딩을 선언합니다.

계산 오버 헤드의 문제를 피하면서 옵션 2의 영향은 무엇입니까?

다른 옵션이 있습니까?

감사

+2

파생 된 클래스에서 재정의하려는 경우를 제외하고 왜 '가상'선언을하고 싶습니까? –

+0

덧붙여서, 또 다른 옵션은 메서드 구현을 서비스가 아닌 핵심으로 컴파일하는 것입니다. –

+0

메소드의 내부 처리가 변경되면 (버그 수정 등),이 수정 사항을 이용하기 위해 모든 플러그인을 다시 컴파일하지 않으려 고합니다. 우리가 런타임 바인딩을 가지고 있다면 코어에서 실행되는 버전을 취하게 될 것입니다. – Corvusoft

답변

2

예, 소비자에게 순수 가상 함수와 인터페이스를 노출하는 것은 윈도우 DLL에서 C++ 객체를 노출시키는 표준 방법입니다. 클라이언트는 구현 세부 사항을 알지 못합니다. 멤버 변수가 없거나 구성원 기능 본문이 없으며 가상 레이아웃 일뿐입니다.

(참조 카운팅 우리가 QueryInterface 전화 할게 dynamic_cast의 언어 무신론자 버전을 추가하고 Windows에서 스며 COM,이)

이 기술은 * nix에서 스크립트 공유 라이브러리에 잘 작동됩니다 게다가.

+0

답장을 보내 주셔서 감사합니다. 그래서 완벽하게 합법적으로 다음과 같은 정의되지 않은 기호 : SQLiteDataSource :: select_notifier (string const &, string const &, string const &)에서 참조하는 Notifier :: get_name()과 같은 오류를 해결하기 위해 virtual 키워드를 배치 할 수 있습니다. SQLiteDataSource.o에서 중지합니다. SQLiteDataSource 플러그인에서이 오류가 발생하고 런타임까지 바인딩이 지연됩니다. – Corvusoft

+0

@ user394663 : 순수 가상 함수가있는 기본 클래스에 대해 클라이언트에게 알리고 파생 클래스에서 구현하면 클라이언트가 구현을 직접 사용하지 못하도록하는 데 매우 효과적입니다. 간단히'가상 '로 코드를 뿌리는 것은 아니다. 인터페이스를 구현과 올바르게 분리하기 위해 상속을 도입해야합니다. –