2013-05-23 22 views
5

現在のノードの次のポインタにbを代入する方法があるかどうかは疑問でした。私はそれを行うことができる別の方法はありますか?今、私は私のノートを振り返る変換が無効ですか?ポインタへのconstポインタの代入

invalid conversion from ‘const blog*’ to ‘blog*’ [-fpermissive] 

を取得しています、演算子のオーバーロードをしながら、私は定数を使用する必要がありますが、今はそれが本当にコンパイルされていないことを示唆しているようです。どのようにconstブログ* bを次のポインタにキャストできますか?ありがとう!

+0

なぜあなたはしたいですか?未定義のビヘイビアを呼び出さずに定数を変更することはできません。キャスティングと忘れは解決策ではありません。 – chris

+1

あなたはSatanと彼の 'const_cast'を召喚しない限り、そうするつもりはありません。このポインタがその文脈で 'const'としてマークされていれば、それを変更する方法を許さないはずです。 – Nbr44

+4

なぜあなたはオブジェクトに値を割り当てるのに 'operator +'を使っていますか? –

答えて

7

あなたの質問とコメントから、私はconst blog *の意味について混乱していることを理解しています。

ポインタタイプを後でに読み込む必要があります。

  • blog *ブログへのポインタです - あなたは、ポインタ値を変更することができ、あなたは尖った-へのポインタを持つオブジェクトを変更することがあります。
  • blog const *(およびconst blog *)はconstブログへのポインタです。ポインタ値を変更することはできますが、このポインタでオブジェクトを変更することはできません。
  • blog * constブログへのconstポインタ - ポインタ値を変更することはできませんが、このポインタを使ってポインティング先オブジェクトを変更することはできます。

2つのタイプがあるため、混乱が頻繁に発生します。ポインターのタイプと指差しタイプ。どちらもconstである可能性があります。

operator+のインターフェイスでは、そのポインタ(constブログへのポインタ)によってパラメータが指すオブジェクトが変更されないことを保証します。しかし、それをブログへのポインタに割り当てると、オブジェクトを変更してインタフェース契約を破ることができます。インターフェイスを再考するか、演算子の実装を変更することをお勧めします。ポインタで操作するのではなく、ポインティング先のオブジェクトの内容を内部リストにコピーしたい場合があります。

+1

の前に型指定子の後にconstを使用したことはありません。 'const blog *'と 'blog const *'が同じであることを追加することもできます(特に後者は "後方に型を読み込む"に近いため) – Joe

+0

True 、私は – Fiktik

+0

でそれを編集しますパーフェクト!私はconst blog *とblog const *は同じことを知っていたので混乱しましたが、私が本当に私を混乱させるblog * constを見たときには同じことでした!それはきれいになった、ありがとう! – ZZPLKF

0

本当にあなたのクラスの通常の意味と使い方とは違って、operator +をオーバーロードしたい場合は、パラメータをconstとして宣言する必要はありません。その方法を使えば、あなたが削除したり、変数のconstantnessを捨てますnext = const_cast<blog *>(b)

はconst_castを使用することができ、あなたの問題

0

取り組むことができます。

1

実際にconstポインタを非constポインタにキャストしたい場合は、Gauravが提案するようにconst_castを使用できます。

しかし、私はちょうど私が使用しなければならない他の誰かのlib/apiによって本当に腹を立てたときの最後の手段としてそれを使用します。これは、独自のコードで起こっている場合は

これはUsusallyにあなたは慎重にあなたのAPI /インターフェースを設計されておらず、および/または誤用は/私は強くあなたがについてconst correctnessを読むためにenourage「constの正しさ」

を誤解していることを意味します。

更新日: const corectnessは、私たちがC++で持っている単なる別のものではありません。時にはいくつかの苦痛を加えるかもしれませんが、あなたのコードのクライアントだけでなく、コンパイラ/オプティマイザにもいくつかの仮定があります。 const_castを実行すると、文字通り「ルールが破られ、予期しない動作につながる可能性があります。

0

あなたのノートは、おそらくあなたが+かをオーバーロードしているかのよう

などを(彼らは結果を作成するために使用されている)2つのオペランドが変更されないバイナリ演算子のオーバーロードの通常の場合、参照している - に算術演算を行う。

あなたのパラメータは、変更が許可されていないオブジェクトへのポインタです。ノードデータがクラスに格納されているリンクされたリストを持つようになりました。オブジェクト。

エラーを修正するためのキャストを使用するだけで、パラメータconstを作成する目的が破棄されるだけで、constを作成しない方が良いでしょう。

演算子のオーバーロードは単なる関数なので、私が見ることができる他の関数よりもconstが必要な難しい理由はありません。

関連する問題