-1

重複の可能性:
C++: ポインター変数を関数に渡す

これは、当面の問題を示していると思われる単純化されたコードスニペットです。

std::wstring *Variable3 = &SomeWStringObject;

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring *Variable1 = NULL;
    func(Variable1);
}

void func(std::wstring *Variable2)
{
    Variable2 = Variable3;
}

現在、実際にfuncはクラスVariable3のメンバーであり、同じクラスのメンバーでもあります。Variable3この単純な例では、 がある種のグローバル変数であると仮定しましょう。

Variable3std::wstringオブジェクトへの (グローバル変数) ポインターです。正しい文字列を指しているよりも、デバッガーで確認できます。

私がやりたいのはVariable1、 と同じ std::wstring オブジェクトを指していることVariable3です。

そこで、ポインターのアドレスを関数に渡そうとしました。これにより、アドレスポイントが にVariable1設定されることを期待しました。Variable3Variable1

しかし、これは機能していません。OKに設定されているようですが、プログラムが終了するfuncと、Variable1はまだヌルポインターです。

私はできる限り明確にしようとしました。それで十分だと思います。残念ながら、これには func の戻り値を使用できません。実際にstd::wstringstreamは、同じことを行う別のオブジェクトが 2 つあるからです。すべてが同じ問題を抱えているため、1 つのstd::wstringオブジェクトだけに単純化しました。&と の他のさまざまな組み合わせを試しまし*たが、どれもうまくいきませんでした。

何卒よろしくお願い申し上げます。

4

3 に答える 3

4

ポインターを参照で渡します。

void func(std::wstring *& Variable2)

他の回答で示唆されているように、あなたがしていることを達成するためのより良い方法があります。この状況でポインターを使用することは、まったく不要です。

于 2012-12-22T14:02:55.973 に答える
2

途中の手順はスキップします。C++ では、次のようにします。

std::string mystring;

std::string func() {
    return mystring;
}

int main() {
    std::string variable1 = func();
}

いくつかのコメント:

  • ポインターを失います。それらはここでは役に立たず、複雑さを増すだけです。
  • 引数を変更するには、参照渡しします (ただし、私はこれを行っていません)。
  • 引数を変更しないでください。代わりに値を返します。
  • std::wstringWinAPI とのインターフェイスとして except を使用しないでください。
  • 変数 in を介して透過的に変更したいために、同じ基になる文字列への参照を共有する必要がある場合main(その場合のみ!)、コピーの代わりに参照を返します。

    std::string& func() {
        return mystring;
    }
    

    …しかし、これはおそらく悪い考えです。func実際にメンバー関数である場合、通常、内部の変更可能な状態を外部の世界に公開するべきではありません。これは、優れたコード設計のいくつかのルールを破っています。

于 2012-12-22T14:13:02.717 に答える
1

現時点Variable1では、(null ポインター値である)の値をコピーしfuncてから、そのコピーを変更しています。だからVariable1外側funcは変わらない。少しポインターを使いがちな人にとっての当面の解決策は、別のレベルの間接化を追加することです。あなたにポインターを渡し、Variable1それを介して変更します。そのようです:

func(&Variable1);

void func(std::wstring** Variable2)
{
  *Variable2 = Variable3;
}

しかし、これはあまり良いスタイルではありません。C++ には、オブジェクトをコピーせずに関数に渡すことができる参照型があるため、関数内のオブジェクトは の外側のオブジェクトと同じになります。次のように使用できます。

func(Variable1);

void func(std::wstring*& Variable2)
{
  Variable2 = Variable3;
}

Variable2ポインターへの参照です ( で示されます&)。を渡すVariable1と、それはコピーされず、Variable2正確に同じポインターを参照することを意味します。変更Variable2すると変更されVariable1ます。

次に自問する必要があるのはstd::wstring、「そもそもポインタが必要か?」ということです。私はあなたにそれを答えることができませんが、多くの場合、答えはノーです。

次に、次の質問は、パラメーターを介して出力を渡す理由です。これは非常にCっぽいことです(しかし、この状況では彼らでさえそうしません)。これが、戻り値がある理由です。理想的には、コードは次のようになります。

std::wstring Variable3 = SomeWStringObject;

int _tmain(int argc, _TCHAR* argv[])
{
  std::wstring Variable1 = func();
}

std::wstring func()
{
  return Variable3;
}

または、潜在的に への参照を返したい場合があります。Variable3その場合、func戻り値の型は になりますstd::wstring&

于 2012-12-22T14:07:31.973 に答える