Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数据类型类与读取器/解析器之间的耦合_C++ - Fatal编程技术网

C++ 数据类型类与读取器/解析器之间的耦合

C++ 数据类型类与读取器/解析器之间的耦合,c++,C++,假设我有一个Image类 class Image { private: unsigned char* data; int sizex; int sizey; public: Image(std::string filename); }; 以及从磁盘读取图像的类: class JpegReader; 当涉及到通过文件名构造函数读取图像时,如何设计这些类?我希望减少耦合并避免循环依赖 一个选项是让led JpegReader成为图像类end的朋友,让它写入成员变量: class

假设我有一个Image类

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

public:
  Image(std::string filename);
};
以及从磁盘读取图像的类:

class JpegReader;
当涉及到通过文件名构造函数读取图像时,如何设计这些类?我希望减少耦合并避免循环依赖

一个选项是让led JpegReader成为图像类end的朋友,让它写入成员变量:

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()返回图像,并让图像构造函数进行交换:

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;
}

您是如何设计的?

我可能会这样设计:

class Image {
public:
  Image(unsigned char* aData, int aSizex, int aSizey) { ... }
}
图像读取器的抽象基类(允许您在不了解任何信息的情况下传递读取器):

具体读卡器(除通过公共构造函数外,与
图像
无耦合):


我可能会这样设计:

class Image {
public:
  Image(unsigned char* aData, int aSizex, int aSizey) { ... }
}
图像读取器的抽象基类(允许您在不了解任何信息的情况下传递读取器):

具体读卡器(除通过公共构造函数外,与
图像
无耦合):


图像基本上是一个位图类。。。jpeg读取器是一种jpeg文件读取器,它应该返回位图(在您的情况下为图像)。你也可以有一个通用的ImageReader接口…图像基本上是一个位图类。。。jpeg读取器是一种jpeg文件读取器,它应该返回位图(在您的情况下为图像)。你也可以有一个通用的ImageReader接口……在一个真实的例子中,图像构造函数中可能需要3个以上的参数。然后将它们全部收集到一个结构中是很有诱惑力的,突然你重新发明了Image类…@Pibben:在一个真实的例子中,
Image
类可能提供的功能远不止是存储二维和颜色矩阵。在实际示例中,图像构造函数中可能需要3个以上的参数。然后将它们全部收集到一个结构中是很有诱惑力的,突然你重新发明了图像类…@Pibben:在一个真实的例子中,
Image
类可能提供比仅仅存储二维和颜色矩阵更多的功能。
class JpegReader: public ImageReader {
public:
  virtual Image read(const std::string& filename) {
    return Image(readdata(), readsizex(), readsizey());
  }
};