【问题标题】:Public functors using anonymous classes使用匿名类的公共函子
【发布时间】:2012-07-26 23:35:11
【问题描述】:

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

// 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_ 随处可见,我不需要它!我该如何解决这个问题?

【问题讨论】:

    标签: c++ function anonymous-class


    【解决方案1】:

    不这样做。只要有

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

    并与它一起使用

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

    具有函子而不是函数的原因之一是它们能够通过操作携带和公开状态,您的方法会为了简洁获得 2 个括号而将其丢弃。

    【讨论】:

    • 对于简单的仿函数,比如zero,我不需要传递任何额外的信息。在这种情况下使用函子而不是普通函数的原因是其余代码是使用 CF 基类编写的。
    • @GradGuy 我说:原因之一。还有一些类似模板的自动参数推导,自动重载消歧,或者这里的运行时多态性。所有你不能用函数得到的东西。你试图做的只是严重违背了语言的意图,这种情况在 C++ 中非常罕见,因为它几乎可以做任何事情。
    • 我认为你是对的;最好坚持标准。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多