Doxygen で文書化されている、純粋仮想関数を呼び出す関数をFoo
持つこの単純な基本クラスを検討してください。foo
foo_
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
}
foo_
ここで、によって呼び出されるを呼び出すときに x に前提条件がありfoo
ます。次に、foo
最終的な型に応じて前提条件があります。
いくつかの質問 :
Foo::foo
最終的なタイプに関係なく、前提条件を追加する必要がありますか? ユーザーがクラスを使用するときに最終型をまったく知らない場合、それは論理的に見えます。ただし、ユーザーは前提条件なしで別のクラスをBaz
派生させ、負の値で明示的に呼び出すこともできます。それは問題ではないはずです。Foo
Baz::foo(double)
- 私のポリモーフィズムの概念では、クラス
Foo
は自分の子供について何も知る必要がないため、前提条件は存在しません。しかし、親クラスのユーザーは、クラスを使用するために子クラスを知る必要はありません。この矛盾を解決するには? - この種のことを Doxygen で文書化する特定の(/最良の)方法はありますか?