C++ 使用匿名类的公共函子

C++ 使用匿名类的公共函子,c++,function,anonymous-class,C++,Function,Anonymous Class,我有一个纯虚拟类CF,它表示1D中的任何连续函数,它被定义为头文件 // tools.h class CF { public: virtual double operator()(double x) const=0 ; }; 我想做的是使用functor包装几个简单的函数,并在tools.h中定义它们。如果我使用匿名类,比如: // tools.h class : public CF{ public: virtual double operator()(double x) co

我有一个纯虚拟类
CF
,它表示1D中的任何连续函数,它被定义为头文件

// tools.h
class CF
{
public:
    virtual double operator()(double x) const=0 ;
};
我想做的是使用functor包装几个简单的函数,并在
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.
随处可见,我不需要它!如何解决此问题?

不这样做。只要

struct zero : public CF {
  double operator()(double x) { return 0.; }
};
和它一起使用

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

让函子覆盖函数的一个原因是它们能够通过操作携带和公开状态,您的方法会抛弃这一点,以获得2个括号的简洁性。

对于简单的函子,如
zero
,我不需要传递任何额外的信息。在本例中使用函子而不是普通函数的原因是,其余代码是使用
CF
基类编写的。@GradGuy我说:原因之一。还有一些类似于模板的自动参数推断、自动重载消歧或此处的运行时多态性。所有你不能从函数中得到的东西。你所要做的是严重违反语言的意图,这种情况在C++中是非常罕见的,因为它几乎可以做任何事情。我认为你是正确的。最好坚持标准。谢谢