如何在C++中使用x[i][j]对矩阵进行索引?包括最终解决方案



我有下面的C++代码,它定义了一个Vector类和一个Matrix类。我想使用诸如"m[I][j]"之类的索引来访问矩阵中的元素。

但是编译器在这一行引发了一个错误

std::cout << data[i][j];

在以下代码中:

#include <iostream>
template<class T>
class Vector{
public:
  Vector(int length){
    size = length;
    data = new T[size];
  }
  ~Vector(){
    delete [] data;
  }
  void set_value(T value){
    for (int i = 0; i< size; i++){
      data[i] = value;
    }
  }
  void print(){
    for (int i = 0; i < size; i++){
      std::cout << data[i] << std::endl;
    }
  }
  T operator[](int index){
    return data[index];
  }
private:
  T * data;
  int size;
};
template<class T>
class Matrix{
public:
  Matrix(int height, int width) {
    this -> height = height;
    this -> width = width;
    Vector<T> * * data = new Vector<T> * [height];
    for (int i = 0; i < height; i++){
      data[i] = new Vector<T>(width);
    }
  }
  
  ~Matrix(){
    for (int i = 0; i <= width; i++){
      delete [] data[i];
    }
    delete [] data;
  }
void set_value(T value){
    for (int i = 0; i <= height; i++){
      data[i] -> set_value(value);
    }
  }
  void print(){
    for (int i = 0; i < height; i++){
      for (int j = 0; j< width; j++){
        std::cout << data[i][j];
      }
      std::cout << std::endl;
    }
  }
  Vector<T> * operator[](int index){
    return data[index];
  }
private:
  Vector<T> * * data;
  int height;
  int width;
};
int main(){
  Vector<float> v = Vector<float>(10);
  v.set_value(1.0);
  std::cout << v[1] << std::endl;
  Matrix<float> m = Matrix<float>(10, 10);
  m.set_value(1.0);
  m.print();
  std::cout << m[5][5] << std::endl;
}

我搜索了一下,但没有直接的答案。乐于助人的人都非常感激。提前谢谢。

具体错误消息如下:

无法将"std::ostream"lvalue绑定到"std::basic_stream&amp;'


我根据下面的友好建议修改了代码

它现在正在编译,但在stdout中打印"1"后运行它会出现"分段错误">

#include <iostream>
template<class T>
class Vector{
public:
  Vector(int length){
    size = length;
    data = new T[size];
  }
  ~Vector(){
    delete [] data;
  }
  void set_value(T value){
    for (int i = 0; i< size; i++){
      data[i] = value;
    }
  }
  void print(){
    for (int i = 0; i < size; i++){
      std::cout << data[i] << std::endl;
    }
  }
  T operator[](int index){
    return data[index];
  }
private:
  T * data;
  int size;
};
template<class T>
class Matrix{
public:
  Matrix(int height, int width) {
    this -> height = height;
    this -> width = width;
    Vector<T> * * data = new Vector<T> * [height];
    for (int i = 0; i < height; i++){
      data[i] = new Vector<T>(width);
    }
  }
  
  ~Matrix(){
    for (int i = 0; i <= width; i++){
      delete [] data[i];
    }
    delete [] data;
  }
  
  void set_value(T value){
    for (int i = 0; i <= height; i++){
      data[i] -> set_value(value);
    }
  }
  void print(){
    for (int i = 0; i < height; i++){
      for (int j = 0; j< width; j++){
    std::cout << (*this)[i][j];
      }
      std::cout << std::endl;
    }
  }
  Vector<T>&  operator[](int index){
    return *(data[index]);
  }
private:
  Vector<T> * * data;
  int height;
  int width;
};
int main(){
  Vector<float> v = Vector<float>(10);
  v.set_value(1.0);
  std::cout << v[1] << std::endl;
  Matrix<float> m = Matrix<float>(10, 10);
  m.set_value(1.0);
  m.print();
  std::cout << m[5][5] << std::endl;
}

更新

在用指针等修复了所有错误之后,一个似乎有效的解决方案,感谢所有的帮助

#include <iostream>
template<class T>
class Vector{
public:
  Vector(int length){
    size = length;
    data = new T[size];
  }
  ~Vector(){
    delete [] data;
  }
  void set_value(T value){
    for (int i = 0; i< size; i++){
      data[i] = value;
    }
  }
  void print(){
    for (int i = 0; i < size; i++){
      std::cout << data[i] << std::endl;
    }
  }
  T operator[](int index){
    return data[index];
  }
private:
  T * data;
  int size;
};
template<class T>
class Matrix{
public:
  Matrix(int height, int width) {
    this -> height = height;
    this -> width = width;
    data = new Vector<T> * [height];
    for (int i = 0; i < height; i++){
      data[i] = new Vector<T>(width);
    }
  }
  
  ~Matrix(){
    for (int i = 0; i <= width; i++){
      delete data[i];
    }
    delete [] data;
  }
  
  void set_value(T value){
    for (int i = 0; i < height; i++){
      data[i] -> set_value(value);
    }
  }
  void print(){
    for (int i = 0; i < height; i++){
      for (int j = 0; j< width; j++){
  std::cout << (*this)[i][j];
      }
      std::cout << std::endl;
    }
  }
  Vector<T>&  operator[](int index){
    return *(data[index]);
  }
private:
  Vector<T> * * data;
  int height;
  int width;
};
int main(){
  Matrix<float> m = Matrix<float>(10, 5);
  m.set_value(1.0);
  m.print();
}

更改Matrix::operator[](int index),使其返回对Vector的引用,而不是指针。否则,矩阵语法将不起作用。

编辑:在行中:

Vector<T> * * data = new Vector<T> * [height];

您正在创建一个新的本地变量data,它隐藏了您的成员变量data。更改为:

data = new Vector<T> * [height];
  Matrix(int height, int width) {
    this -> height = height;
    this -> width = width;
    Vector<T> * * data = new Vector<T> * [height];
    for (int i = 0; i < height; i++){
      data[i] = new Vector<T>(width);
    }
  }

应该是

  Matrix(int height, int width) {
    this -> height = height;
    this -> width = width;
    data = new Vector<T> * [height];
    for (int i = 0; i < height; i++){
      data[i] = new Vector<T>(width);
    }
  }

您的版本将data声明为局部变量,并隐藏具有相同名称的类级变量。这是一个常见的新手错误。

首先,您的构造函数实现错误。你做

 Vector<T> * * data = new Vector<T> * [height];

这将初始化局部变量data,并将new[]的结果存储在该局部指针中。您需要将指针存储在类成员data中,而不是本地变量中。删除局部变量声明,改为使用成员data

其次,矩阵类的析构函数中存在错误。在析构函数中,delete [] data是正确的,但循环中的delete [] data[i]是完全不正确的。在循环中,应该使用delete,而不是delete []

问题已经解决(我已经测试过了(。它在标准输出中输出

11111
11111
11111
11111
11111
11111
11111
11111
11111
11111

似乎是正确的做法。

相关内容

最新更新