模板继承矩阵和平方矩阵C++
template inheritance matrix and square matrix C++
请帮我纠正以下错误。
错误1错误C2248:"SquareMatrix::SquareMatrix":无法访问类"SquareMatrix"中声明的私有成员
我试图在类(矩阵)下实现一个子类(平方矩阵),但我不知道如何修复错误。这是代码。
#ifndef _MATRIX_
#define _MATRIX_
#include <iostream>
#include <vector>
using namespace std;
//class matrix starts here
template<class T, int m, int n>
class Matrix{
vector<vector<T>> elements;
int nrow;
int ncol;
public:
Matrix();
~Matrix();
template<class T, int m, int n>
Matrix<T, m, n>::Matrix() : nrow(m), ncol(n){
for (int i = 0; i < nrow; i++){
vector<T> row(ncol, 0);
elements.push_back(row);
}
}
template<class T, int m, int n>
Matrix<T, m, n>::~Matrix(){}
//here is the inheritance class SquareMatrix
template<class T, int n>
class SquareMatrix : public Matrix<T, n, n>{
SquareMatrix();
};
template<class T, int n>
SquareMatrix<T, n>::SquareMatrix() :nrow(n), ncol(n){
for (int i = 0; i < nrow; i++){
vector<T> row(ncol, 0);
elements.push_back(row);
}
}
//Here is the main.cpp
#include "Matrix.h"
using namespace std;
int main(){
Matrix<double, 3, 2> a;
SquareMatrix<double, 3> c;
}
通过尝试在派生类构造函数的成员初始化器列表中初始化基类的成员变量,您遇到的问题浮出水面。除非基地是虚拟基地,否则这是不需要的,甚至是不允许的。相反,只需将can踢到基类,并让其构造函数初始化这些成员:
template<class T, int n>
SquareMatrix<T, n>::SquareMatrix() : Matrix<T,n,n>()
{
}
如果您没有注意到,这还修复了发布代码中的另一个逻辑缺陷。填充实际的elements
向量已经由基类完成,因此在派生类中也不需要它。调用基类构造为您处理它。
改进
以下是可以做的事情列表,以大大简化这个代码:
- 矩阵维度模板参数应为无符号数据类型。矩阵不能有负维度,所以代码甚至不允许它
- 矩阵的行元素也是不必要的动态(向量),而不是固定的(数组)。动态内存支持整个结构是有意义的,但由于模板参数用于声明维度,因此可以对行类型使用
std::array<T,n>
,并将其封装在大小为m
的动态std::vector
中 ncol
和nrow
成员在矩阵的生命周期内永远不应该更改,因为它们实际上是基于模板参数的。如果你想保留它们,请将它们更改为公共静态constexpr
(尽管老实说,我看不出你有什么理由这样做;m
和n
在你的模板中随处可见- 基类只不过是一个使用相同宽度和高度的收缩,甚至不需要单独的类派生;您只需使用
using
别名即可完成此操作
最后,代码简化为:
#include <vector>
#include <array>
// matrix managed on the heap as a vector of arrays
template<class T, size_t m, size_t n>
class Matrix
{
std::vector<std::array<T, n>> elements;
public:
static constexpr size_t nrows = m;
static constexpr size_t ncols = n;
Matrix() : elements(m)
{
}
};
到目前为止,导出的平方矩阵类是精简的,它可以是一个简单的using
别名:
// a square matrix built via a regular matrix
template<class T, size_t m>
using SquareMatrix = Matrix<T,m,m>;
当然,仍然需要以某种方式提供对elements
成员的访问,否则大部分访问都毫无意义。
祝你好运,我希望它能有所帮助。
SquareMatrix<T, n>::SquareMatrix() :nrow(n), ncol(n){
此处的构造函数正在尝试初始化其成员nrow
和ncol
。
当然,问题是这个类没有任何名为nrow
和ncol
的成员。他们是其超类的私人成员。
模板就是一个类。类的构造函数只能初始化它自己的成员。它无法初始化其超类的任何成员。超类的构造函数负责初始化它自己的成员。
您没有指定要使用的编译器,但这是一个非常可怕的错误消息。gcc
的错误信息更有意义:
t.C:40:37: error: class ‘SquareMatrix<T, n>’ does not have any field named ‘nrow’
SquareMatrix<T, n>::SquareMatrix() :nrow(n), ncol(n){
附言:帮自己一个忙,完全忘记"使用命名空间std;"。假设C++中没有这样的东西。尤其是在头文件中。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 使用std::vector的OpenCL矩阵乘法
- 嵌入方指针压缩已禁用
- 使用C++中的模板和运算符重载执行矩阵运算
- Eigen如何在容器循环中干净地附加矩阵
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 具有N列和N行的矩阵,列必须具有N-1、N-2等值
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- GCC本机矩阵运算库
- 矩阵向量乘法(cublasDgemv)返回零
- 以螺旋方式打印矩阵的程序.(工作不好)
- OpenCV C++.快速计算混淆矩阵
- Eigen对修复非正定义的协方差矩阵有解吗
- 使用 OpenCV 计算协方差矩阵
- 如何计算mahadistance的协方差矩阵
- 与opencl和opencv的协方差矩阵
- cv::PCA (openCV)计算数据本身的协方差矩阵?或者我们应该传递协方差矩阵给它
- OpenCV只计算一个样本的协方差矩阵
- c++计算图像中每个区域的2 3x3协方差矩阵
- C++PCA-计算协方差矩阵