1

グレースケール画像を管理するクラスがあります。libpngで保存したいです。constそのためには、次のようなメンバー関数を使用します。

void GrayscaleImage::SavePNG(std::string filename) const
{
    // ...
    png_bytep* row_pointers = new png_bytep[m_height];
    for (int i = 0; i < height_; i++) {
        row_pointers[i] = const_cast<png_bytep>(m_data.data()) +  i * m_width * sizeof(uint8_t);
    }
    png_set_rows(png_ptr, info_ptr, row_pointers);
    // ...
}

問題は、 の 3 番目の引数png_set_rowsが非 const であるためconst_cast、メンバー関数を にしたい場合は、ある時点で使用する必要GrayscaleImage::SavePNGがあることconstです。私は疑問に思っています、これを行うのは安全ですか?

4

3 に答える 3

0

関数定義のconstは、インスタンスが変更されるべきではないと言っているだけです。ファイルに保存してもインスタンスは変更されないため、問題ありません。もちろん、 の 3 番目のパラメーターは、設定されるためでpng_set_rowsはありませんconst

それらがクラスに属していない限り、 const 関数で何かを作成、破棄、または変更しても問題ありません。あなたのコードは、GrayscaleImage のインスタンスを変更しません。

于 2012-07-06T13:11:14.660 に答える
0

安全ではありません。png_set_rows()宣言された の 3 番目のパラメーターconstがないと、入力データが変更されないという保証はありません。

constパラメータを宣言できる場合でも、パラメータを宣言しないライブラリを常に処理する必要があります。const_castそれが存在する理由です。細心の注意を払って使用する必要があります。しかし、説明から判断png_set_rows()すると、データが変更される可能性は低いです。

編集:これがソースコードです。変更されていないことがわかりますrow_pointers。(しかし、それは間違いなく他の 2 つの引数を変更します!)

void PNGAPI
png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
{
   png_debug1(1, "in %s storage function", "rows");

   if (png_ptr == NULL || info_ptr == NULL)
      return;

   if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);

   info_ptr->row_pointers = row_pointers;

   if (row_pointers)
      info_ptr->valid |= PNG_INFO_IDAT;
}
于 2012-07-06T19:20:28.723 に答える