1

CF1Dの連続関数を表す純粋な仮想クラスがあり、ヘッダーファイルが定義されています

// tools.h
class CF
{
public:
    virtual double operator()(double x) const=0 ;
};

私がやろうとしているのは、ファンクターを使用していくつかの単純な関数をラップし、それらを内部で定義することtools.hです。次のような匿名クラスを使用する場合:

// tools.h
class : public CF{
public:
    virtual double operator()(double x) const { return 0.0; }
} zero;

次に、クラスがどこtools.hにでも再定義されているため、問題が発生します。gcc は不平を言います:

// tools.h included in main.cpp, foo.cpp, and bar.cpp
foo.o:(.bss+0x0): multiple definition of `zero'
main.o:(.bss+0x0): first defined here
bar.o:(.bss+0x0): multiple definition of `zero'
main.o:(.bss+0x0): first defined here

私は次のようなことをすることでこれを修正できると考えました:

// tools.h
class zero_: public CF{
public:
    virtual double operator()(double x) const { return 0.0; }
};

const static zero_ zero;

zero_しかし、どこにでも表示されているので、私はそれが好きではありません。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

それをしないことによって。ただ持っている

struct zero : public CF {
  double operator()(double x) { return 0.; }
};

そしてそれを一緒に使う

void fun(const CF& cf);
fun(zero());

関数よりもファンクターを使用する理由の 1 つは、操作を通じて状態を保持および公開する機能です。簡潔にするために 2 つの括弧を取得するために、アプローチはそれを破棄します。

于 2012-07-26T23:39:40.283 に答える