2009-07-23 4 views
6

클래스에 대한 모든 함수 호출과 해당 클래스에서 상속 한 클래스의 모든 함수 바로 전에 일부 코드 (아마도 함수)를 실행하고 싶습니다. 나는 모든 기능을 실제로 편집하지 않고이 작업을하고 싶습니다. 그런 작업도 가능합니까?C++에서 모든 함수 호출 전에 코드 실행

직전에 호출되는 대신 모든 함수 호출의 첫 번째 명령으로 호출되는 함수를 가지고 있다고 가정합니다.

답변

8

AspectC++은 원하는 것입니다. 나는 그것을 직접 사용하지 않았지만 Aspect-Oriented Programming 패러다임은이 정확한 문제를 해결하려고 시도합니다.

+0

나는 당신이 당신의 코드에 얼마나 많은 비용을들이는지, 어떤 코드가 확장 될지는 결코 알지 못하기 때문에 Aspects에 엄격하게 반대한다. C++에서 이들을 디버깅하는 방법도 명확하지 않습니다. 왜냐하면 코드를 효과적으로 생성하고 함수의 진입 점을 완전히 변경할 수 있기 때문입니다. – ovanes

1

기본 유형의 객체를 취하고 주변 기능을 호출 한 다음 호출하려는 기능을 호출하는 래퍼 클래스를 빌드하는 방법이 다소 불편합니다. 이것은 decorator과 같을 것입니다.

0

이것은 프로파일 러의 역할처럼 들립니다. 프로파일 링 도구의 소스를 살펴 보셨습니까?

+0

계약 프로그래밍과 더 비슷합니다. 사전 계약 및 사후 계약을 점검하여 계약이 파손되지 않았 음을 확인합니다. –

3

비 가상 인터페이스 관용구를 사용하는 것이 좋습니다. 모든 공용 함수는 가상이 아닙니다. 모든 가상 기능은 보호되거나 비공개입니다. 공용 멤버는 가상 멤버에 대한 호출을 위임하며 일반적으로 인라인 함수로 구현됩니다.

IOStreams가 STL에서 구현되는 방식입니다. C++ Wikibooks에서 자세한 내용을 볼 수 있습니다.

의도 : 한 위치에서 전체 클래스 계층 구조에 대한 코드 조각 (예 : 불변성 검사, 잠금 획득/해제) 전후의 모듈화/리팩토링.

감사합니다,
Ovanes 당신이 할 수있는 최선의 보호 및 클래스에서 상속 개발자가 가상 ​​함수를 재정의 가지고 가상 함수의 집합을 선언하는 것입니다

1

. 기본 클래스에서 사용하는 인터페이스는 public이 될 수 있습니다.이 인터페이스는 정보를 보호 된 가상 메서드에 전달하기 전에 원하는 코드를 실행합니다. 예를 들어

:

class Base { 
    public: 
    void MyMethod(void) { /* Insert code here */ YourMethod(); } 
    protected: 
    virtual void YourMethod(void) {} 
}; 

개발자가 자신이 특정 서브 클래스를 가지고 있음을 알고 있다면, 그는 여전히 단순히 dynamic_cast의 사용, 자신의 방법 세트를 사용하여 코드를 우회 할 수있다. 따라서 기본 C++ 언어와 관련이없는 이미 게시 된 다른 제안을 따르기를 원할 수 있습니다.

+0

나는 테스트중인 클래스에 침입하는 것을 포함하지 않는 다른 방법을 생각할 수있다. –

2

또 다른 사항은 [boost/C++ 0X] shared_ptr 래퍼를 사용하는 것입니다. 클래스 인스턴스 포인터를 반환하기 전에 '->'오버로드에서 사용자 정의 함수를 호출해야합니다. 사용법은 수정하지만 기본 클래스는 수정하지 않고 같은 효과를 내기 위해 두 번 사용했습니다. 그냥 또 다른 생각.

+0

이것은 훌륭한 대안처럼 들립니다. – Greg

0

g++을 사용하면 각 컴파일 단위에 대해 -pg 옵션을 사용할 수 있습니다. 이렇게하면 컴파일러에서 모든 함수의 시작 부분에 mcount 함수에 대한 호출을 생성합니다. mcount은 일반적으로 gprof과 같은 프로파일 링 도구를 통해 제공되지만 직접 구현할 수도 있습니다. 당신은 그러나

  • mcount는 C의 연결이 있는지 확인해야합니다 (그리고하지 C++ - 스타일 이름 망가), 즉 C 함수로 구현하고 gcc 같은 순수한 C 컴파일러로 컴파일하여.
  • mcount을 포함하는 컴파일 단위는 -pg으로 컴파일되지 않습니다.