C++ 数据类型类与读取器/解析器之间的耦合
假设我有一个Image类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
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());
}
};