1

これが許可されている理由がわかりません:

void Renderer::UpdateTextureFromArray(unsigned int* colors, unsigned int size, TextureData* textureData) const
{
    D3D11_MAPPED_SUBRESOURCE ms;
    this->deviceContext->Map(textureData->texture, 0, D3D11_MAP_WRITE_DISCARD, NULL, &ms);

    memcpy(ms.pData, colors, sizeof(unsigned int) * size * size);
    this->deviceContext->Unmap(textureData->texture, 0);
}

UpdateTextureFromArray 関数を const にしましたが、そのメンバーに対して非 const 関数を呼び出すことはできますか?

この場合、関数に const というラベルを付けるのはスタイルが悪いのでしょうか?

編集:明確にするために、この const のような関数を持っている場合、社会に「嘘をついている」のですか? 完璧な世界では、このコードはコンパイルされませんよね?

4

3 に答える 3

5

おそらくdeviceContextポインターデータメンバーであるため、constメソッドはポインターを変更できません。ただし、ポインターが指すオブジェクトを変更することは許可されています。

struct Bar {
  void bar() {} // non const method
};

struct Foo {
  Foo() : p(0) {}
  void foo() const { p->bar();} // const method calling non-const method of Bar
  Bar* p;
};

int main()
{
  const Foo f;
  f.foo();  // OK, Foo::p is not modified
}
于 2013-02-20T22:50:07.680 に答える
2

そのメンバーで非定数関数を呼び出すのではなく、そのメンバーを逆参照し(変更しないため、constポインターを使用して実行できます)、結果で非定数メンバーを呼び出しますその逆参照。

于 2013-02-20T22:51:38.117 に答える
1

そのメンバーで非 const 関数を呼び出しているのではなく、非 const オブジェクトを指しているポインター (const) にアクセスしています。これにより、const 以外の関数を呼び出すことができます。

スタイルに関しては、const メソッドは、ユーザーの観点からオブジェクトの状態を変更しないメソッドです。したがって、このポインター アクセスがこれを行うかどうかを検討する必要があります。一部のクラスは並列化の候補となります。この場合、const メソッドは、副作用がないと想定されるため、並列化する安全なメソッドと見なされます。

したがって、const のメソッドを修飾するには、次のようにすることをお勧めします。

  • 並列化の候補ではなく、ユーザーに目に見える副作用がない
  • 並列化の候補ですが、適切な同期があるか、副作用がまったくありません。
于 2013-02-20T23:05:44.097 に答える