两类具有相同的独立隐藏功能

时间:2018-12-11 08:49:20

标签: c++

有一个一个文件,其中包含两个单独的类和一个功能:

int foo(int x) {return x+x;}
class A {
    public:
    int bar(){return foo(0);} 
};
class B {
    public:
    int bar(){return foo(1);}
};

他们都需要使用功能

仅使用其自变量(不使用A或B中的任何数据)。 我可以将此函数声明为全局函数。但是我想为其他文件隐藏此功能(因此这在其他文件中不可见,不可访问)。因此,我可以将此函数声明为A类和B类的成员函数。但这将是重复的代码。

最佳做法是什么?

5 个答案:

答案 0 :(得分:4)

您可以从任何标头中省略foo的任何声明,而mark it static或在匿名名称空间中进行定义。

AB.h

class A { int bar(); };
class B { int baz(); };

AB.cpp

static int foo(int x) { return x+x; }
/* or
namespace {
    int foo(int x) { return x+x; }
}
*/    


int A::bar() { return foo(1); }
int B::baz() { return foo(2); }

答案 1 :(得分:1)

您可以简单地将函数放在该文件中仅存在的另一个类中:

class C
{
public:
    static void foo(int) {}
};

class A
{
    void test1()
    {
        C::foo(0);
    }
};

class B
{
    void test2()
    {
        C::foo(0);
    }
};

A和B现在可以访问此函数,并且尚未全局声明。

您还可以将函数放在其自己的名称空间中:

namespace ABFunctions
{
    void foo(int) {}
}

这是在逻辑上使其分开的另一种方法。

如果您需要保护访问权限,则可以通过以下方式做到这一点:

class C
{
friend class A;
friend class B;
private:
    static void foo(int) {}
};

class A : C
{
    void test1()
    {
        C::foo(0);
    }
};

class B : C
{
    void test2()
    {
        C::foo(0);
    }
};

现在,只有A和B类可以访问foo(int)

答案 2 :(得分:1)

您可以创建一个基类并从中派生。您不必重复代码。

class Base {
    virtual ~Base = 0;
protected:
    int foo(int x) {return x+x;}
};

class A : public Base {...}
class B : public Base {...}

您无法实例化Base的对象。

答案 3 :(得分:0)

如果它不使用A或B中的任何数据,则可能不应该在A或B中实现它。听起来f似乎是某种辅助函数。也许创建一个类var buttonColours = ["blue", "red", "green"]; var randomColour = buttonColours[Math.floor(Math.random() * buttonColours.length)]; console.log(randomColour);并将其设为实用程序类的公共静态函数会更好。

答案 4 :(得分:0)

在c ++中,尽管您可以创建一个仅包含私有静态函数的实用工具类,并使用friend明确指定哪些类可以访问,但是在命名空间级别上没有隐藏函数关键字:

class C {
   friend class A;
   friend class B;
   static void foo(int);
};

int foo(int x) {return x+x;}
class A {
    public:
    int bar(){return C::foo(0);} 
};
class B {
    public:
    int bar(){return C::foo(1);}
};

尽管这不是一个很好的设计模式,因为friend引入了更多的维护工作,因此与AB以外的其他类也需要访问foo

一种可能更好的模式是使用我在此处的问答中所概述的界面:

那里的接口的引入遭受virtual多态性的开销。也许可以通过CRTP引入static polymorphism来解决。


关于维护和重用实现详细信息的广泛观点,您为什么要隐藏功能foo()严格要求的这些信息。为什么您需要完全隐藏此实现细节?