1

Image クラスがあるとします。

class Image {
private:
  unsigned char* data;
  int sizex;
  int sizey;

public:
  Image(std::string filename);
};

ディスクから画像を読み取るクラス:

class JpegReader;

ファイル名コンストラクターを介して画像を読み取る場合、これらのクラスをどのように設計すればよいですか? 結合を減らし、循環依存を回避したいと考えています。

1 つのオプションは、JpegReader を Image クラスとフレンドにすることです。最後にメンバー変数を書き込みます。

class JpegReader {
public:
  static void read(std::string filename, Image& image);
};

Image::Image(std::string filename) {
  JpegReader::read(filename, *this);
}

void JpegReader::read(std::string filename, Image& image) {
  image.data = readdata();
  image.sizex = readsizex();
  image.sizey = readsizey();
}

別のオプションは、すべてのメンバー変数を引数として持つコンストラクターを使用することです。

Image(unsigned char* aData, int aSizex, int aSizey) : data(aData),
                                                      sizex(aSizex),
                                                      sizey(aSizey) {}

void JpegReader::read(std::string filename, Image& image) {
  Image tmp(readdata(), readsizex(), readsizey());
  std::swap(tmp, image);
}

または、read() に Image を返させ、Image コンストラクターにスワップを行わせます。

class JpegReader {
public:
  static Image read(std::string filename);
};

Image::Image(std::string filename) {
  Image tmp = JpegReader::read(filename);
  std::swap(*this, tmp);
}

Image JpegReader::read(std::string filename) {
  Image tmp(readdata(), readsizex(), readsizey());
  return tmp;
}

どのように設計したでしょうか?

4

1 に答える 1

1

私はおそらく次のように設計します:

class Image {
public:
  Image(unsigned char* aData, int aSizex, int aSizey) { ... }
}

画像リーダーの抽象基本クラス (リーダーについて何も知らなくてもリーダーを渡すことができます):

class ImageReader {
public:
  virtual Image read(const std::string& filename) = 0;
};

具体的なリーダー (Imageパブリック コンストラクター以外への結合なし):

class JpegReader: public ImageReader {
public:
  virtual Image read(const std::string& filename) {
    return Image(readdata(), readsizex(), readsizey());
  }
};
于 2012-11-28T07:42:50.643 に答える