我必须使用C ++设计一个库,以下是我的要求。
这个想法可以像这样概述出来吗?
class BaseClass
{
public:
virtual void foo() = 0;
};
用户实现就像
class DerivedClass: public BaseClass
{
public:
virtual void foo() {/*come impl*/}
};
使用以下代码
BaseClass * bp = new DerivedClass();
bp->foo();
应该等同于
BaseClass * bp = new DerivedClass();
log_start(typeid(*bp).name());
bp->foo();
log_end(typeid(*bp).name());
但我不能问我的图书馆用户(甚至我无处可去),只要他们使用我的API,就可以把这些记录内容放进去。由于有很多虚函数及其用法,我无法在我的lib中随处可见。
有没有简单的方法来实现这一目标?我是否需要创建自己的虚拟桌?
答案 0 :(得分:3)
您可以让用户实施foo
,而不是让他们直接致电foo
,而是拨打bar
。 bar
会将呼叫包裹到foo
,如:
class BaseClass {
public:
void bar() {
log_start(typeid(*this).name());
foo();
log_end(typeid(*this).name());
}
protected:
virtual void foo() = 0;
};
用法是:
BaseClass * bp = new DerivedClass();
bp->bar();
答案 1 :(得分:2)
在这种情况下,您应该使用类似 Template Method 模式的内容
class BaseClass
{
public:
void foo() {
log_start(typeid(*this).name());
doFoo();
log_end(typeid(*this).name());
}
protected:
virtual void doFoo() = 0;
};
class DerivedClass: public BaseClass
{
protected: // or private, depends on use case
virtual void doFoo() {/* some impl */}
};
int main() {
BaseClass * bp = new DerivedClass();
bp->foo();
delete bp;
return 0;
}
查看工作示例here。