1

我的代码中的一个常见场景是我得到了一个被层次结构中的许多类使用的函子。

为了让所有类都可以访问它并保持 DRY,我通常将它定义为我的基类的受保护内部结构,如下所示:

class Base
{
protected:
    struct CommonFunctor
    {
        bool operator()()
        {
            return true;
        }
    };
};

class DerivedA : public Base
{
    void FooA()
    {
        bool test = CommonFunctor()();
    }
};

class DerivedB : public Base
{
    void FooB()
    {
        bool test = CommonFunctor()();
    }
};

我不喜欢这个解决方案,因为它用许多小的仿函数使我的基类变得混乱,这些仿函数只是内部的,即使公众无法访问它们,它们也会降低我的基类的可读性。

你知道这种情况的任何其他解决方案吗?

4

3 回答 3

1

只需在新文件 ( BaseClassFunctors.cpp+ BaseClassFunctors.h) 中实现您的仿函数。将它们放在您的命名空间中,并带有可选的子命名空间(例如命名空间 main.internal)。

现在您将头文件包含在您想要的任何派生类中,而不会弄乱基类头。

于 2012-05-23T05:59:24.730 回答
0

您可以在其他地方实现函子并仍然将其保留为 Base 的成员:

class Base
{
protected:
    struct CommonFunctor;
};   

struct Base::CommonFunctor
{
    bool operator()()
    {
        return true;
    }
};
于 2012-05-22T08:43:31.103 回答
0

尽管我(显然,其他所有人)讨厌多重继承,但它在这里会派上用场。

只需创建一个包含所有仿函数的第二个类,并在派生自 的子类中Base继承这两个Base类和这个新类。

于 2012-05-22T07:47:36.657 回答