我目前正在为传感器数据的可视化和操作应用程序的设计而苦苦挣扎。我有一个数据库,其中包含几个带有测量数据的 STL 容器。
std::unordered_map<std::string, std::array<uint16_t, 3366>> data1;
std::unordered_map<std::string, QImage> data2;
std::unordered_map<std::string, std::vector<Point3D>> data3;
我也有不同的 View (主要是基于 Qt 的),每个 View 都应该与特定于其中一个数据集的模型相关联。因此 data1 应该在名为 model1 的类中进行处理和操作,然后通过类 view1 等显示。
但我似乎找不到合适的设计结构来融入这个想法。这些模型授予对其处理数据的访问权限,但该数据包含在上面给出的不同容器结构中。这使得在基类中使用带有纯虚函数的继承变得不可行,例如
std::map<...,...> getModelData() = 0;
这种继承的最初想法是避免代码重复,但这似乎不是正确的解决方案。我知道 Qt 在他们的“模型 View ”概念中利用他们的 QVariant 类在返回的类型方面具有最大的灵 active 。但是,我想知道,这里使用标准 C++ 的最佳解决方案是什么?我读了很多关于努力实现松散耦合、代码可重用性、依赖倒置以及如何支持组合而不是继承的内容,但我在将这些理论建议付诸实践时确实遇到了问题,并且大多数时候最终会出现代码膨胀和重复代码。你能帮帮我吗?
最佳答案
也许您可以提供更多代码,但到目前为止,我可以提供一些提示:
-你能用 QMap 代替 std::unordered_map 吗?如果你需要纠结一个 UI 就更敏捷
-也许使列表的第二个参数成为通用基本类型,例如(代码未测试,视为伪代码)
class BaseDataClass
{
public:
int getType();
QImage* getImageData();
std::array<uint16_t, 3366>>& getArray();
std::vector<Point3D>>& getVector();
private:
int mType;
BaseDataClass(); //hide ctor or make abstract, as you wish
}
您可以避免代码重复。创建三个新类,每个类都继承自 BaseDataClass。然后,您可以创建一个遍历所有 BaseDataClass 的方法,检查类型(例如 1=QImage;2 = array;3 = vector),并根据类型执行正确的方法(从所有类型 1 获取 QImage .. .).您也可以将指针转换为正确的类型。如果您的派生类获得越来越多的功能(如排序或验证数据),这会更好
关于C++模型 View 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538331/