代码之家  ›  专栏  ›  技术社区  ›  malat

如何在成员初始化列表中调用函数?

  •  0
  • malat  · 技术社区  · 4 年前

    我有以下简单的C++(RAII模式)包装器 jpeg_decompress_struct

    class Decompress {
      typedef jpeg_decompress_struct *ptr;
      jpeg_decompress_struct srcinfo;
    
     public:
      Decompress() { jpeg_create_decompress(&srcinfo); }
      ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
      operator ptr() { return &srcinfo; }
      jpeg_decompress_struct *operator->() { return &srcinfo; }
    };
    

    我对这段代码很满意,我希望 srcinfo expect it .)

    -Weffc++

    jpeg.cxx:92:3: error: ‘acme::Decompress::srcinfo’ should be initialized in the member initialization list [-Werror=effc++]
       92 |   Decompress() { jpeg_create_decompress(&srcinfo); }
          |   ^~~~~~~~~~
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Frank    4 年前

    jpeg_create_decompress() jpeg_decompress_struct

    jpeg_decompress_struct make_initialized_jds() {
      jpeg_decompress_struct result;
      jpeg_create_decompress(&result);
      return result;
    }
    
    class Decompress {
      typedef jpeg_decompress_struct *ptr;
      jpeg_decompress_struct srcinfo;
    
     public:
      Decompress() : srcinfo(make_initialized_jds()) {}
      ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
      operator ptr() { return &srcinfo; }
      jpeg_decompress_struct *operator->() { return &srcinfo; }
    };
    

    根据更新后的问题:如果您只是想消除警告,可以使用成员初始化来明确初始化结构:

    class Decompress {
      typedef jpeg_decompress_struct *ptr = nullptr; // <---- might as well. 
      jpeg_decompress_struct srcinfo = {0}; // <----- here
    
     public:
      Decompress() { jpeg_create_decompress(&srcinfo); }
      ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
      operator ptr() { return &srcinfo; }
      jpeg_decompress_struct *operator->() { return &srcinfo; }
    };
    

    这将给 srcinfo 调用之前定义的值