如何包装用户功能?

How to wrap user functions?

我有3个函数会在一个项目的不同类中使用。这些函数使用(仅读取)公共变量,但以不同的方式操作输入数据。

我不确定如何封装这些函数。我实际上不希望用户可以使用常见的 read-only 变量。我想出了两个解决方案:

  1. C-Style header 唯一办法。此解决方案允许用户查看 var0 和 var1。我不想要的。 (命名空间方法也无法隐藏 read-only 变量 AFAIK。)
#ifndef FUNC_H
#define FUNC_H
const int var0 = 30;
const int var1 = 75;

void func0(float input0)
{//manipulate input0//}

void func1(float input1)
{//manipulate input1//}

void func2(float input2)
{//manipulate input//}
#endif //FUNC_H
  1. Class接近
#ifndef FUNC_H
#define FUNC_H

class Func
{
    public:
        static void func0(float input0);
        static void func1(float input1);
        static void func2(float input2);

    private:
        Func();
        static const int var0 = 30;
        static const int var1 = 75;
};

void Func::func0(float input0){}
void Func::func1(float input1){}
void Func::func2(float input2){}

#endif //FUNC_H

这可行,但我不确定这是否是实现我想要的目标的正确方法。基本上,我想像 STL 库一样包装它们。你有什么建议?

由于公共变量是实现的一部分,而不是接口的一部分,只需将它们与函数定义一起放在一个实现文件中。

因此,布局可以是:

// func_h.hpp
#ifndef FUNC_H
#define FUNC_H

// only declarations
void func0(float input0);
void func1(float input1);
void func2(float input2);

#endif //FUNC_H

// func_h.cpp

// common variables not part of the interface
const int var0 = 30;
const int var1 = 75;

// but definitions can use the common variables

void func0(float input0)
{//manipulate input0//}

void func1(float input1)
{//manipulate input1//}

void func2(float input2)
{//manipulate input//}

如果您想将函数放在 header 文件中(例如,作为内联函数或模板函数),通常使用 detail 命名空间。是的,您 header 的用户可以访问它,但通常的做法是忽略它(因为它是一个实现细节)

所以,

#ifndef FUNC_H
#define FUNC_H

namespace detail {
    const int var0 = 30;
    const int var1 = 75;
}

void func0(float input0)
{
    // Use `detail::var0`
}

void func1(float input1)
{
    using namespace detail;
    // Or put a using declaration and
    // just use `var0`

}

void func2(float input2)
{
    // ...
}
#endif //FUNC_H