// myclass.h
#pragma once
void publicFunction();
//------
// myclass.cpp
#include "myclass.h"
#include <iostream>
void privateFunction() {
std::cout << "Hello world\n";
}
void publicFunction() {
privateFunction();
}
//-------
// main.cpp
#include "myclass.h"
#include <iostream>
void privateFunction() {
std::cout << "Hello main\n";
}
int main()
{
privateFunction();
}
上面的程序将无法编译(privateFunction(void) already defined in myclass.obj
)。解决这个问题的一种方法是定义一个namespace
源文件内:
#include "myclass.h"
#include <iostream>
namespace MyClass
{
void privateFunction();
// add a bunch other private functions here
}
void MyClass::privateFunction() {
std::cout << "Hello world\n";
}
//---
using namespace MyClass;
void publicFunction() {
privateFunction();
}
这是解决这个问题的正确方法吗?我觉得这可能会在以后引起一些问题,但我不知道正确的方法是什么。
如果你在头文件中声明一个函数,那就不是这样了private
首先。如果privateFunction
应该是一个实现细节,请考虑仅在翻译单元中声明它。为此,您有两种常见的选择。
-
使用匿名namespace
在实施文件中。
namespace {
void privateFunction() {
std::cout << "Hello world\n";
}
}
这样你就可以调用privateFunction()
from publicFunction
,仍然保护任何使用privateFunction
来自编译单元外部。
-
使函数static
在翻译单元内。
static void privateFunction() {
std::cout << "Hello world\n";
}
与1具有相同的效果。
在 1. 和 2. 之间进行选择主要取决于个人喜好。如果您希望对函数定义进行排序,使被调用函数出现在调用函数下方,请选择 2.,因为 1. 在函数声明点强制执行函数定义。
请注意,这种隔离的缺点是降低了为辅助函数编写特定单元测试的能力,因为您无法链接到来自“外部”的单元测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)