gpt4 book ai didi

c++ - 模板继承矩阵和方阵C++

转载 作者:行者123 更新时间:2023-11-28 00:04:43 25 4
gpt4 key购买 nike

请帮我更正以下错误。

Error 1 error C2248: 'SquareMatrix::SquareMatrix' : cannot access private member declared in class '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;
}

最佳答案

您遇到的问题是通过尝试在派生类构造函数的成员初始化列表中初始化 类的成员变量来解决的。除非基地是虚拟基地,否则不需要,甚至不允许。取而代之的是,简单地将 jar 头踢到基类的道路上,并让它的构造函数初始化这些成员:

template<class T, int n>
SquareMatrix<T, n>::SquareMatrix() : Matrix<T,n,n>()
{
}

如果您没有注意到,这还修复了您发布的代码中的另一个逻辑缺陷。填充实际 elements vector 已经由您的基类完成,因此您也不需要在派生类中使用它。调用基类构造会为您处理。

改进

下面列出了可以大大简化此代码的事情:

  • 矩阵维度模板参数应该是无符号数据类型。矩阵不能有负维数,因此编写代码甚至不允许它。
  • 矩阵的行元素不必要地也是动态的( vector )而不是固定的(数组)。拥有动态内存支持的整个结构是有意义的,但由于模板参数用于声明维度,您可以使用std::array<T,n>对于行类型,并将其包装在动态 std::vector 中尺寸m
  • ncolnrow成员不应该在矩阵的生命周期内改变,因为它们实际上是基于模板参数的。将它们更改为 public static constexpr如果您想保留它们(尽管老实说,我看不出您想要保留它们的理由;mn 随您的模板出现在任何地方。
  • 基类只不过是使用相同宽度和高度的限制,甚至不需要单独的类派生;你可以简单地用 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仍然需要提供某种方式的成员,否则大部分都是毫无意义的。

祝你好运,希望对你有所帮助。

关于c++ - 模板继承矩阵和方阵C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36440696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com