避免为默认函数参数公开静态变量

时间:2017-12-11 17:23:11

标签: c++

我有一个更新全局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的外部声明,以实现这一点。

我宁愿不暴露它,它是否可能?

2 个答案:

答案 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 */ }
}

但是,我怀疑这会打破现有的依赖关系。如果很少并且易于修复,这可能就是这样。

其他评论也是正确的。你应尽量避免使用全局状态 - 这是设计不佳的症状。