有一个一个文件,其中包含两个单独的类和一个功能:
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类的成员函数。但这将是重复的代码。
最佳做法是什么?
答案 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
引入了更多的维护工作,因此与A
或B
以外的其他类也需要访问foo
一种可能更好的模式是使用我在此处的问答中所概述的界面:
那里的接口的引入遭受virtual
多态性的开销。也许可以通过CRTP引入static polymorphism来解决。
关于维护和重用实现详细信息的广泛观点,您为什么要隐藏功能foo()
严格要求的这些信息。为什么您需要完全隐藏此实现细节?