我有一个更新全局foo()
的函数CAtlList
。现在我想重用foo
来更新另一个列表。目前,我使用默认参数实现此目的。
//header.h
extern CAtlList<data> globalList;
void foo(CAtlList<data> &somelist = globalList);
//file1.cpp
CAtlList<data> globalList;
void foo(CAtlList<data> &somelist)
{
//update somelist
}
//file2.cpp
#include "header.h"
foo();
and
CAtlList<data> anotherList;
foo(anotherList);
//use anotherList
但是对于默认方案foo
需要引用globalList
,这意味着globalList
必须在声明时可见。我不得不公开并添加globalList
的外部声明,以实现这一点。
我宁愿不暴露它,它是否可能?
答案 0 :(得分:2)
使用重载,而不是默认参数。
void foo();
void foo(CAtlList<data> &somelist);
在.cpp
中,您需要花费4行代码:无参数foo
的主体使用正确的参数调用1参数foo
。这是获得您想要的表现力的总成本。默认参数不是您工作的工具。
答案 1 :(得分:0)
我不知道你可以避免声明一个被引用为默认值的变量。但是,你可以简单地重载函数:
//file1.h
void foo();
void foo(CAtlList<data> &somelist);
//file1.cpp
#include "file2.h"
CAtlList<data> globalList; // Local scope only
void foo(CAtlList<data> &somelist)
{
//update somelist
}
void foo()
{
foo(globalList);
}
更现代的方法是使用&#39;可选&#39;该课程是C ++库的一部分:
http://en.cppreference.com/w/cpp/utility/optional
//file1.h
#include <optional>
void foo(optional<CAtlList<data>> &somelist);
//file1.cpp
#include "file1.h"
CAtlList<data> globalList; // Local scope only
void foo(optional<CAtlList<data>> &somelist){
if (somelist.has_value()) { /* update somelist */ }
else { /* update globalList */ }
}
但是,我怀疑这会打破现有的依赖关系。如果很少并且易于修复,这可能就是这样。
其他评论也是正确的。你应尽量避免使用全局状态 - 这是设计不佳的症状。