1

特定のコードに2つのポインター(const Vec*aとconstVecb)があります。パラメーターを持たない関数(const Vec *)には、コード中にインスタンス化されるこれら2つの値を渡す必要があります。ただし、(Vec *)のみ。関数定義を移動せずにこれを行うにはどうすればよいですか?ただし、必要に応じて、どのような手順を実行する必要がありますか?

//const Vec* from;
//const Vec* at;
Vec* viewVec; 
viewVec = Vec::sub( view->at, view->from);


//static Vec* sub(Vec*, Vec*);
Vec* Vec::sub(Vec* a, Vec* b) {
    return new Vec(a->x - b->x, a->y - b->y, a->z - b->z);
}
4

4 に答える 4

3

最も簡単な答えはおそらく「しないでください」です。Vec *の代わりにを使用する必要がある場合はVec const *、最初にそのように宣言します。

これが変更しないことを約束するサードパーティの関数であるが、何らかの理由でに嫌悪感があるconst場合は、他の人がリストしたconst_castソリューションが唯一の選択肢です(より優れたサードパーティのライブラリを使用する以外)。

あなたstd::vectorが指しているポインタが実際にはconst(宣言の時点で)そうではなく、たまたまstd::vector const *それを参照している場合、それを使用するのは「安全」です(しかし一般的には賢明ではありません)const_cast。ただし、最初にであると宣言された変数を変更するとconst、それは未定義の動作になります。たとえば、コンパイラは、コストのかかる操作をstd::vector const複数回実行していることを認識し、結果の特定の部分を自由にキャッシュできる場合があります。これは、常に同じことを処理していると見なすことができるため、変更した場合は、不正確な(または一貫性のない)結果を取得します。

于 2012-05-10T23:51:07.277 に答える
2

あなたはconst_castこれに使うことができます、例えば

viewVec = Vec::sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));

あなたがすべきかどうかは別の問題です。関数のシグネチャを本当に変更できない場合(おそらく最も簡単な修正です)、危険なキャストを含むラッパーをいつでも作成できます。そうすれば、少なくとも呼び出し元はキャスト自体を行う必要がありません。

Vec *Vec::sub(const Vec *a, const Vec *b) {
    return sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));
}
于 2012-05-10T23:48:17.087 に答える
1

const_cast<type>(value)いこうぜ ;)

于 2012-05-10T23:48:08.950 に答える
0

人々が言っ​​たように、あなたは使うことができますconst_cast。これを注意深く行う必要がある理由は、変更してはならないものを変更してしまう可能性があるためです。たとえば、あるオブジェクトがポインタをそのまま宣言するのconstは、このポインタが変更できないようにするためです。次にconst_castポインタを渡して別の関数に渡すと、他の関数が新しいものを指すようになり、それを保護しようとした元のオブジェクトをねじ込む可能性があります。

特に、オブジェクトAがconstポインタが指すメモリの一部を割り当てた場合はどうなりますか。次に、を介して関数へのポインタを渡し、const_castこの関数deleteがメモリを使用するか、またはそれを再実行allocすると、元のメモリは削除されずに存在します。

お役に立てれば。

于 2012-05-11T00:53:02.530 に答える