考虑这个简单的基类Foo
,它有一个foo
调用纯虚函数的函数foo_
,用 Doxygen 记录:
class Foo
{
public:
/** \brief This function logs x and does the job */
void foo(double x);
protected:
/** \brief This function does the job */
virtual void foo_(double x) = 0;
};
void Foo::foo(double x)
{
std::clog << "'Foo::foo(double x)' is called with x = " << x << std::endl;
this->foo_(x);
}
我没有先决条件来记录这个抽象类。
现在,考虑一个派生类Bar
,在该派生类上存在正确工作的前提条件:
class Bar : public Foo
{
public:
/**
* \brief This function does the job
* \pre x must be greater or equal to 0
*/
virtual void foo_(double x);
};
void Bar::foo_(double x)
{
assert(x >= 0.0 && "PRE: x can't be negative");
// Do the job
}
现在,当我调用 x 时,我有一个先决条件foo_
,即由 调用foo
。然后,我有一个先决条件foo
取决于最终类型。
一些问题 :
Foo::foo
无论最终类型如何,我都应该添加前提条件吗?如果用户在使用类时从不知道最终类型,这看起来很合乎逻辑。但是用户也可以在没有任何先决条件的情况下Baz
从另一个类派生,并使用负值显式调用。这不应该是一个问题。Foo
Baz::foo(double)
- 在我的多态性概念中,班级
Foo
不必知道他的孩子的任何事情,那么前提条件就不能存在。但是母类的用户不必知道子类就可以使用该类。如何解决这个矛盾? - 有没有一种特定的(/最好的)方法来用 Doxygen 记录这种事情?