27

私は次のようなレガシー関数を持っています:

int Random() const
{
  return var_ ? 4 : 0;
}

そして、そのレガシーコード内で関数を呼び出して、次のようにする必要があります。

int Random() const
{
  return var_ ? newCall(4) : 0;
}

問題は、このエラーが発生することです。

In member function 'virtual int Random() const':
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers

newCall()これで、このエラーを修正するために、const関数を作成できることがわかりました。しかし、その後、いくつかnewCall()の関数呼び出しを行う必要があるため、これらの関数呼び出しをすべてconstにする必要があります。などなど、最終的にはプログラムの半分がconstになるように感じます。

私の質問:constではないRandom()内の関数を呼び出す方法はありますか?または、私のプログラムの半分をconstにすることなく、 newCall()内部で実装する方法について誰かがアイデアを持っていますか?Random()

ありがとう

-ジョシュ

4

7 に答える 7

23
int Random() const
{
  return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0;
}

しかし、それは良い考えではありません。可能であれば避けてください!

于 2011-02-15T19:31:01.620 に答える
19

const を正しく使用/宣言するようにプログラムを変更する必要があります...

1 つの代替方法は、const_cast を使用することです。

于 2011-02-15T19:31:06.567 に答える
4
const_cast<MyClass *>(this)->newCall(4)

newCall が "this" を変更しないことが確実な場合にのみ、これを行ってください。

于 2011-02-15T19:30:53.263 に答える
1

ここには 2 つの可能性があります。まず、newCall呼び出し先のすべてが実際には非変更関数です。その場合は、絶対に調べて、すべてマークする必要がありますconst。あなたと将来のコード管理者の両方が、コードを読みやすくしてくれたことに感謝します (ここでの個人的な経験から言えば)。第二に、newCall実際に DOES はオブジェクトの状態を変更します (おそらくそれが呼び出す関数の 1 つを介して)。この場合、API を中断し、Random非 const にして、オブジェクトの状態を変更することを呼び出し元に適切に示す必要があります (変更が物理的な constness のみに影響し、論理的な constness には影響しない場合は、変更可能な属性を使用して伝播できますconst)。

于 2011-02-15T19:37:54.950 に答える
0

それが実際に乱数ジェネレーターである場合、数値生成コード/状態は、クラスローカル静的ジェネレーターに配置される可能性があります。このように、オブジェクトは変更されず、メソッドはconstのままになる可能性があります。

于 2011-02-15T19:38:48.730 に答える
0

constキャストを使用せずに、Random()メソッドでクラスの新しいインスタンスを作成してみてください。

于 2011-02-15T19:31:49.923 に答える
0

const修飾子は、クラスのインスタンスが操作後に変更されないことを表明します。thisこれは、コンパイラーが自動的に推測できないものです。

const_cast使用できますが、その悪

于 2011-02-15T19:32:24.777 に答える