非类功能可以私有化吗?

时间:2015-10-05 16:15:46

标签: c++

我在我制作的命名空间中有一些函数可以在整个程序中使用。

在头文件中:

namespace NQueens
{
    static int heur = 0;
    int CalcHeuristic(char** state, int size);
    void CalcHorzH(char ** state, int &heuristic, int size);
    void CalcColH(char ** state, int &heuristic, int size);
    void CalcDiagH(char ** state, int &heuristic, int size);
    int calcCollisions(int queensPerRow, int size);
}

一切正常。但是,实际从我的外部程序代码调用的唯一函数是CalcHeuristic(char** state, int size)函数。 然后该函数调用其他函数本身。

由于这些不属于某个类,我的编译器不允许我将其他函数声明为private。有没有办法做到这一点?我应该担心吗?

5 个答案:

答案 0 :(得分:11)

不要在标题中声明它们,将它们放在实现文件中的匿名命名空间中。

示例标题:

namespace NQueens
{
    int CalcHeuristic(char** state, int size);
}

示例实施:

namespace
{
    static int heur = 0;
    void CalcHorzH(char ** state, int &heuristic, int size);
    void CalcColH(char ** state, int &heuristic, int size);
    void CalcDiagH(char ** state, int &heuristic, int size);
    int calcCollisions(int queensPerRow, int size);
}

namespace NQueens
{
    int CalcHeuristic(char** state, int size)
    {
        // ...
    }
}

namespace
{
    void CalcHorzH(char ** state, int &heuristic, int size) {}
    void CalcColH(char ** state, int &heuristic, int size) {}
    void CalcDiagH(char ** state, int &heuristic, int size) {}
    int calcCollisions(int queensPerRow, int size) { return 0; }
}

答案 1 :(得分:5)

不,你不能使自由职能private 你可以做的不是在命名空间中声明它们并在翻译单元中使用匿名命名空间:

在标题中:

namespace NQueens {
    static int heur = 0;
    int CalcHeuristic(char** state, int size);
}
.cpp中的

namespace {
    void CalcHorzH(char ** state, int &heuristic, int size) {
       // Implementation
    }
    void CalcColH(char ** state, int &heuristic, int size) {
        // Implementation
    }
    void CalcDiagH(char ** state, int &heuristic, int size) {
        // Implementation
    }
    int calcCollisions(int queensPerRow, int size) {
        // Implementation
    }
}

另一种选择是使用类而不是命名空间,将所有这些函数包含为static函数成员。您可以将所有常用范围语义用作privateprotectedpublic

但是IIRC这样的类(仅包含static函数成员)不会被认为是优秀的做法,而不是将函数置于名称空间中。

虽然如果你想要实现protected继承,那么这种方法可能会被认为是有用的。

答案 2 :(得分:4)

使用私有静态方法(伪代码):

class NQueens
{
public:
  static void CalcHeuristic()
  {
    CalcColH();  // Legal here
  }

private:
  static void CalcColH(){}
}

//...
NQueens::CalcHeuristic(); // Legal
NQueens::CalcColH(); // error

私人 - 是OOP及其逻辑可见性。 static或匿名命名空间 - 是链接时可见性。

答案 3 :(得分:1)

您无法将独立功能设为私密。但是您可以在cpp文件中将它们定义为静态,并且不在.h文件中提供它们的原型,以便外部调用者无法调用它们。

编辑。对于所有静态仇恨者来说,这里有一些需要考虑的事情。如果你想在定义它们之前声明你的函数(这可能是因为它是一个好习惯,或者因为一个人正在调用另一个函数而不必要),你将不得不打开匿名命名空间,声明隐藏'函数,关闭命名空间,定义可见函数,再次打开匿名空间,定义隐藏函数。

现在,在我查找的编译器中,两个匿名命名空间具有相同的名称,这是有效的,这是不保证的。

匿名命名空间的另一件事 - 尝试将断点放入其函数中。

答案 4 :(得分:1)

如果函数必须是模板或内联,典型的解决方案是将它们放在名为detail的命名空间中,并假设人们无法访问它们。

否则,请勿在头文件中声明它们。