2017-12-11 9 views
1

グローバルCAtlListを更新する関数foo()があります。今度は別のリストを更新するために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のextern宣言を追加して追加する必要がありました。

私はむしろそれを公開したくはありませんが、それは可能ですか?

+2

fooをより一般的なものにしたいのですか? – StoryTeller

+0

@StoryTellerはい私はそれが一般的であることを望みます。 – user3819404

+0

@miraduloこれに代わる方法は何ですか? – user3819404

答えて

2

デフォルトパラメータではなく、オーバーロードを使用します。正しい引数を持つ1パラメータfooを呼び出すパラメータなしfooのボディ:

void foo(); 
void foo(CAtlList<data> &somelist); 

は、それはあなたの.cppのコードの4本の短い線がかかります。これはあなたが望む表現力を得るための総コストです。デフォルトのパラメータはあなたの仕事のためのツールではありません。

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); 
} 

より近代的な方法は、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 */ } 
} 

をこれが既存の依存関係を壊すと思われる。修正するのが簡単でない場合は、これがおそらく方法です。

その他のコメントも正しいです。あなたは可能な限りグローバルな状態の使用を避けようとしなければなりません - それは設計の貧弱な症状です。

関連する問題