6

関数を参照してポインターを渡したいので、渡されたポインターが指しているアドレスを実際に変更でき、この引数にデフォルト値を割り当てたいと思います。

このようなもの:

宣言で

void myFunc(SomeType* &var=NULL);

と定義:

void MyClass::myFunc(SomeType* &var){
    if(var!=NULL)
        (*var)=(*someOtherPointer);

    if(someCondition)
        var=NULL;
}

呼び出し先が1つの引数を使用して関数を呼び出すか、引数を使用せずに関数を呼び出すかを決定できるようにします。そして、彼が引数を渡すことを決定し、someConditionが成立した場合、渡されたポインターは後でNULLを指すようになります。

ただし、このようにしようとすると、次のようになります。

エラーC2440:'デフォルトの引数':'int'を'SomeType *&'に変換できません

助けてくれてありがとう!

4

5 に答える 5

14

NULLは左辺値ではありません - 参照によって渡すことはできません。4を期待する関数に渡すようなものint&です。

'int' の部分はNULL、マクロで定義されているためです0

あなたの最善の策は、ポインターを使用してポインターを参照渡しすることです。つまり、ダブルポインターです。次に、パラメーターが の場合NULL、何も渡されませんでした。そうでない場合は、変更する必要があるのはポインターのアドレスです [someCondition が保持されている場合に NULL を指すように]。

于 2009-12-02T01:09:14.500 に答える
7

エラー メッセージがすべてを物語っています。参照先へのポインターではなく、整数を渡しています。必要なことを行うには、ポインターからポインターへのポインターを使用できます。

void myFunc(SomeType** var=NULL);

void MyClass::myFunc(SomeType** var){
    if(var!=NULL && *var!=NULL)
        (**var)=(*someOtherPointer);

    if(var!=NULL && someCondition)
        *var=NULL;
}
于 2009-12-02T01:16:53.783 に答える
2

さて、C ++の頭脳を行使するという観点から、なぜこれを行うのかはわかりますが、実際に本番コードで行うのでしょうか。1年後に同僚としてコードを見ると、副作用のある信じられないほど霧のかかったテクニックのように見えます。明確な名前を持つ2つの別々の関数を使用することを考えましたか?1つはポインターを返し、もう1つは他の必要な作業を実行しますか?

于 2009-12-02T07:30:25.587 に答える
2

boost::optional の使用を検討することもできます (使用できる最も単純なコードではありませんが、オプションはそこにあります)。

void f( boost::optional<int&> r = boost::optional<int&>() )
{
   if ( r ) *r = 5;
}
int main()
{
   int x = 0;
   f( x ); std::cout << x << std::endl; // 5, it did change the value
   f(); // compiler will default to an empty optional<int&> object
}
于 2009-12-02T01:30:53.993 に答える