클래스에 대한 모든 함수 호출과 해당 클래스에서 상속 한 클래스의 모든 함수 바로 전에 일부 코드 (아마도 함수)를 실행하고 싶습니다. 나는 모든 기능을 실제로 편집하지 않고이 작업을하고 싶습니다. 그런 작업도 가능합니까?C++에서 모든 함수 호출 전에 코드 실행
직전에 호출되는 대신 모든 함수 호출의 첫 번째 명령으로 호출되는 함수를 가지고 있다고 가정합니다.
클래스에 대한 모든 함수 호출과 해당 클래스에서 상속 한 클래스의 모든 함수 바로 전에 일부 코드 (아마도 함수)를 실행하고 싶습니다. 나는 모든 기능을 실제로 편집하지 않고이 작업을하고 싶습니다. 그런 작업도 가능합니까?C++에서 모든 함수 호출 전에 코드 실행
직전에 호출되는 대신 모든 함수 호출의 첫 번째 명령으로 호출되는 함수를 가지고 있다고 가정합니다.
AspectC++은 원하는 것입니다. 나는 그것을 직접 사용하지 않았지만 Aspect-Oriented Programming 패러다임은이 정확한 문제를 해결하려고 시도합니다.
기본 유형의 객체를 취하고 주변 기능을 호출 한 다음 호출하려는 기능을 호출하는 래퍼 클래스를 빌드하는 방법이 다소 불편합니다. 이것은 decorator과 같을 것입니다.
이것은 프로파일 러의 역할처럼 들립니다. 프로파일 링 도구의 소스를 살펴 보셨습니까?
계약 프로그래밍과 더 비슷합니다. 사전 계약 및 사후 계약을 점검하여 계약이 파손되지 않았 음을 확인합니다. –
비 가상 인터페이스 관용구를 사용하는 것이 좋습니다. 모든 공용 함수는 가상이 아닙니다. 모든 가상 기능은 보호되거나 비공개입니다. 공용 멤버는 가상 멤버에 대한 호출을 위임하며 일반적으로 인라인 함수로 구현됩니다.
IOStreams가 STL에서 구현되는 방식입니다. C++ Wikibooks에서 자세한 내용을 볼 수 있습니다.
의도 : 한 위치에서 전체 클래스 계층 구조에 대한 코드 조각 (예 : 불변성 검사, 잠금 획득/해제) 전후의 모듈화/리팩토링.
감사합니다,
Ovanes 당신이 할 수있는 최선의 보호 및 클래스에서 상속 개발자가 가상 함수를 재정의 가지고 가상 함수의 집합을 선언하는 것입니다
. 기본 클래스에서 사용하는 인터페이스는 public이 될 수 있습니다.이 인터페이스는 정보를 보호 된 가상 메서드에 전달하기 전에 원하는 코드를 실행합니다. 예를 들어
:
class Base {
public:
void MyMethod(void) { /* Insert code here */ YourMethod(); }
protected:
virtual void YourMethod(void) {}
};
개발자가 자신이 특정 서브 클래스를 가지고 있음을 알고 있다면, 그는 여전히 단순히 dynamic_cast의 사용, 자신의 방법 세트를 사용하여 코드를 우회 할 수있다. 따라서 기본 C++ 언어와 관련이없는 이미 게시 된 다른 제안을 따르기를 원할 수 있습니다.
나는 테스트중인 클래스에 침입하는 것을 포함하지 않는 다른 방법을 생각할 수있다. –
또 다른 사항은 [boost/C++ 0X] shared_ptr 래퍼를 사용하는 것입니다. 클래스 인스턴스 포인터를 반환하기 전에 '->'오버로드에서 사용자 정의 함수를 호출해야합니다. 사용법은 수정하지만 기본 클래스는 수정하지 않고 같은 효과를 내기 위해 두 번 사용했습니다. 그냥 또 다른 생각.
이것은 훌륭한 대안처럼 들립니다. – Greg
다음은 과장 될 수 있습니다. 그렇다면 어때요?
는 또한 Curiously recurring template pattern (CRTP)이 작업을 수행 할 수있다.
g++
을 사용하면 각 컴파일 단위에 대해 -pg
옵션을 사용할 수 있습니다. 이렇게하면 컴파일러에서 모든 함수의 시작 부분에 mcount
함수에 대한 호출을 생성합니다. mcount
은 일반적으로 gprof
과 같은 프로파일 링 도구를 통해 제공되지만 직접 구현할 수도 있습니다. 당신은 그러나
mcount
는 C의 연결이 있는지 확인해야합니다 (그리고하지 C++ - 스타일 이름 망가), 즉 C 함수로 구현하고 gcc
같은 순수한 C 컴파일러로 컴파일하여.mcount
을 포함하는 컴파일 단위는 -pg
으로 컴파일되지 않습니다.
나는 당신이 당신의 코드에 얼마나 많은 비용을들이는지, 어떤 코드가 확장 될지는 결코 알지 못하기 때문에 Aspects에 엄격하게 반대한다. C++에서 이들을 디버깅하는 방법도 명확하지 않습니다. 왜냐하면 코드를 효과적으로 생성하고 함수의 진입 점을 완전히 변경할 수 있기 때문입니다. – ovanes