2016-06-30 11 views
1

スコープの中にポインタconstを持ち、外側にconst以外のポインタを持つことができますか?スコープ内のポインタconst、非const外

私はnewbie question: c++ const to non-const conversionWhat's the point of const pointers? を含むいくつかのトピックやWebページを読んで、私が聞いたメッセージは、「あなたは非constへのconstをキャストする必要がある場合、それは危険だし、あなたのコードは、おそらく悪い設計された」です。しかし、私はこれを克服する方法がわからないです:私は今持っている

何:

void compute(const CArray<FOO> &fooArray, CArray<double> &Results) 
{ 
    Results[0] = 0.0 ; 
    for(INT_PTR i=0 ; i<fooArray.GetCount()-1 ; ++i) 
    { 
     const FOO *foo1 = fooArray[i] ; 
     DoSomething(foo1) ; //BOOL method which needs a const *FOO as parameter 

     const FOO *foo2 = fooArray[i+1] ; 
     DoSomething(foo2) ; //BOOL method which needs a const *FOO as parameter 

     double res = 0.0 ; 
     Compare(foo1, foo2, res) ; //Compare(const FOO *foo1, const FOO *foo2, double &result) 
     Results[i+1] = res ; 
    } 
} 

しかしDoSomethingは非常に貪欲な機能である、と私は同じオブジェクトに二回、それを呼び出すために避けたいと思います。だから私は、これよりも似た何かをしたいと思います:

void compute(const CArray<FOO> &fooArray, CArray<double> &Results) 
{ 
    const FOO *foo1 = fooArray[0] ; 
    Results[0] = 0.0 ; 
    DoSomething(foo1) ; //BOOL method which needs a const *FOO as parameter 
    for(INT_PTR i=1 ; i<fooArray.GetCount() ; ++i) 
    { 
     const FOO *foo2 = fooArray[i] ; 
     DoSomething(foo2) ; //BOOL method which needs a const *FOO as parameter 

     double res = 0.0 ; 
     Compare(foo1, foo2, res) ; //Compare(const FOO *foo1, const FOO *foo2, double &result) 
     Results[i] = res ; 
     *foo1 = *foo2 ; //what i would like to do, but I can't since *foo1 and *foo2 are const 
    } 
} 

私はすべてのconstを削除「でした」しかし、私は読んで話題にmentionnedとして、彼らはここにいる正当な理由がある:DoSomethingCompareではありません*foo1*foo2を変更する予定です。

+1

const ptrを返す関数を作成しますが、insideは非const ptrを使用しますか? – lorro

+1

const以外の引数をconst引数をとる関数に渡すことができます。関数シグネチャにconst引数がある場合、関数シグネチャを変更しないことを約束します。これは変更可能な引数については問題ではありません。 – kamikaze

+0

@kamikazeまあ、それは恥ずかしいです。私はときどき私のコードを見直す必要があると思います。私を地球に戻すためのタイ。 – Benoit

答えて

2

私はあなたが実際にできたすべてのconst

を削除「でした」、そしてそれはあなたの「問題」の解決策になります。 foo1をnon-constへのポインタにするだけで十分です。

DoSomethingとCompareは、* foo1と* foo2を変更するものではありません。

したがって、これらのパラメータは、値、またはconst参照(または何らかの理由で意味をなさない場合はconstへのポインタ)によってパラメータを取る必要があります。どちらの場合でも、非const参照/オブジェクト(または非constへのポインタ)を関数に渡すことはOKです。あなたが欲しい

外何

ポインタの範囲内のCONST、および非constが機能外のいくつかの関数呼び出し内constでポインタ、および非constです。これは私が記述したように簡単に達成されます:const参照(またはconstを必要としない値)パラメータを使用し、非const変数を関数に渡します。

+0

実際、あなたは正しいです、私はちょうど関数呼び出しの内側とconst以外のconst内のconstポインタを必要としました。タイトルを編集する必要がありますか?とにかく – Benoit

関連する問題