2012-05-07 16 views
1

このコードがあるとします。あなたの基本的な "呼び出し元が値を提供しない場合、値を計算する"シナリオ。ポインタの正しい無効な値は何でしょうか?

void fun(const char* ptr = NULL) 
{ 
    if (ptr==NULL) { 
     // calculate what ptr value should be 
    } 
    // now handle ptr normally 
} 

、それが判明しかし、ptrがNULLを含め、値のすべての種類を持つことができるので、私はできません

fun();   // don't know the value yet, let fun work it out 

または

fun(something); // use this value 

のいずれかでこれを呼び出します呼び出し元がptrを提供しないというシグナルとしてNULLを使用します。

だから、NULLの代わりにptrを与えるデフォルト値がわかりません。どのような魔法の価値を使うことができますか?誰にもアイデアはありますか?

+1

ポインタポイントの有効なオブジェクトで、またはnullの場合のいずれか必要があります - 何かがトラブルを求めています。おそらくあなたは[Boost.Optional](http://www.boost.org/libs/optional/)を望んでいますか? – ildjarn

+1

'' NULL 'を提供することとptrを提供しないことの違いは何でしょうか?関数 'handle'が正常にNULLになり、ptrが '提供されていないときの処理方法はどうなるでしょうか? –

+0

私の元のコンセプトでは、 'fun();'と 'fun(NULL); '。なぜなら私はNULLを使うつもりはないからです。しかし、今は 'fun(NULL);を実行して正常に処理する必要があります。それが問題です。私の質問を編集しました。 –

答えて

4
void fun() 
{ 
    // calculate what ptr value should be 
    const char* ptr = /*...*/; 

    // now handle ptr normally 
    fun(ptr); 
} 
+0

私はそれが私が後にしたものだと思います。後で指摘するように、他の機能に同じ名前を付けることができます。 –

0

1?

あなたはそのアドレスであなたにメモリを割り当てる誰も想像することはできません。

+0

ええ、ご存知のように、私は実際にそれについて考えていましたが、それはありません。私のプログラマーの誇りはそれを禁じています。それはちょうどいい気分にはならない。 –

1

nullptrを使用する必要があります。 C++ 11スタンダードの新機能。いくつかの説明についてはhereを見てください。

+1

NULLの代わりに 'nullptr'を使うべきですが、問題を解決するつもりはありません。 – mfontanini

+0

ええと、今はテストすることができません、十分な近代的なコンパイラがありません。ごめんなさい。 –

2

プラットフォームによっては、ポインタが32ビットまたは64ビットのいずれかの値になる可能性があります。

これらの場合には、使用することを検討してください:

0xFFFFFFFF or 0xFFFFFFFFFFFFFFFF 

しかし、私は大きな疑問は、だと思う「有効なパラメータとして渡すことNULLはできますか?」

私は別のパラメータを持つ代わりにお勧めします:

void fun(bool isValidPtr, const char* ptr = NULL) 

または多分:

void fun(/*enum*/ ptrState, const char* ptr = NULL) 
+0

良い点。私は次回のことを覚えておくことができます。私はロナグの答えが好きです、私の場合は。 –

2

私が提供するすべての他の回答に同意するが、ここではその取り扱いのもう一つの方法だ、これにもっと冗長であれば私個人的にはより明示的に見えます:

void fun() 
{ 
    // Handle no pointer passed 
} 

void fun(const char* ptr) 
{ 
    // Handle non-nullptr and nullptr separately 
} 
+1

これは、期待される振る舞いとチェックを1つの関数本体から別の関数本体に分離し、2番目の定義をよりクリーンにし、エラーの発生を少なくすることを好みます。空のargバージョンでは、デフォルトのものを返すか返す – EdChum

1

オーバーロードされたバージョンのth異なる入力のための電子同じ機能がベストですが、あなたは、単一の機能を使用したい場合、あなたはパラメータがポインタへのポインタの代わりにも作ることができます:

void fun(const char** ptr = NULL) 
{ 
    if (ptr==NULL) { 
     // calculate what ptr value should be 
    } 
    // now handle ptr normally 
} 

次に、あなたがこのようにそれを呼び出すことができます

fun(); 

char *ptr = ...; // can be NULL 
fun(&ptr); 
1

有用な引数に対応しない特別な値が必要な場合は、1を作成します。

ヘッダファイル:

extern const char special_value; 

void fun(const char* ptr=&special_value); 

実装:

const char special_value; 

void fun(const char* ptr) 
{ 
    if (ptr == &special_value) .... 
} 
+0

それは、それを覚えておく必要があります。 –

関連する問題