如何包装用户功能?
How to wrap user functions?
我有3个函数会在一个项目的不同类中使用。这些函数使用(仅读取)公共变量,但以不同的方式操作输入数据。
我不确定如何封装这些函数。我实际上不希望用户可以使用常见的 read-only 变量。我想出了两个解决方案:
- 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
- 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
我有3个函数会在一个项目的不同类中使用。这些函数使用(仅读取)公共变量,但以不同的方式操作输入数据。
我不确定如何封装这些函数。我实际上不希望用户可以使用常见的 read-only 变量。我想出了两个解决方案:
- 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
- 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