如何在自定义类MyClass中正确使用QGenericMatrix作为成员属性?
解决QGenericMatrix作为类成员的初始化问题
你的问题核心在于QGenericMatrix的模板参数N和M必须是编译期常量,而你在构造函数里用了运行时传入的变量n和m来实例化模板,这违反了C++模板的基本规则——模板参数需要在编译时就确定具体值,没法用运行时才能知晓的变量来替代。
下面分两种常见场景给出正确的写法:
场景1:矩阵大小在编译期固定
如果你的colorMatrix尺寸是提前确定好的(比如固定3x3、4x4这类常量尺寸),可以直接在类声明里指定模板参数,无需动态分配:
头文件(MyClass.h)
#include <QGenericMatrix> #include <QColor> class MyClass { private: // 直接指定编译期常量作为模板参数,示例为3行3列 QGenericMatrix<3, 3, QColor> colorMatrix; public: MyClass(); // 构造函数无需传入n和m参数 };
构造函数实现(MyClass.cpp)
#include "MyClass.h" MyClass::MyClass() { // 按需初始化矩阵元素,比如设置默认白色 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { colorMatrix(i, j) = QColor(Qt::white); } } }
如果需要支持多种固定尺寸的矩阵,也可以把MyClass做成模板类:
#include <QGenericMatrix> #include <QColor> template <int N, int M> class MyClass { private: QGenericMatrix<N, M, QColor> colorMatrix; public: MyClass(); }; template <int N, int M> MyClass<N, M>::MyClass() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { colorMatrix(i, j) = QColor(Qt::white); } } }
使用时直接指定尺寸:
MyClass<3,3> matrixObj1; MyClass<4,2> matrixObj2;
场景2:矩阵大小需要运行时动态确定
如果矩阵尺寸必须通过构造函数的参数动态传入,QGenericMatrix就不再适用了——它是为固定尺寸矩阵设计的。这时可以用Qt 5.14及以后版本提供的QDynamicMatrix,专门处理动态大小的矩阵:
头文件(MyClass.h)
#include <QDynamicMatrix> #include <QColor> class MyClass { private: QDynamicMatrix<QColor> colorMatrix; public: MyClass(int n, int m); };
构造函数实现(MyClass.cpp)
#include "MyClass.h" MyClass::MyClass(int n, int m) : colorMatrix(n, m) { // 一次性填充所有元素为默认颜色 colorMatrix.fill(QColor(Qt::white)); }
这样就能通过构造函数参数n和m动态创建对应大小的矩阵了。
内容的提问来源于stack exchange,提问作者Simon Defontaine
相关产品推荐
相关产品推荐

