为什么operator []在初始化时有效,在引用2d动态数组时不起作用

时间:2017-01-14 22:43:53

标签: c++ arrays matrix

我无法理解标题中的问题。 所以有我的两个类,一个3个双精度矢量和一个2D动态矩阵,每个单元格中都有一个Vector对象。 Matrix的构造函数可以工作,不会抛出错误。但是,当我想在ostream重载中引用创建的Matrix实例的单元格时,我得到了

  

“'运算符[]'不匹配(操作数类型为'Matrix'和'int')”

为什么在初始化期间使用[] []表示法可以,以后不行? 是否有一种中等直接的方法来解决这个问题? 非常感谢!

class Vector{
private:
double x, y, z;

public:
Vector(){
    x = y = z = 0;
}
Vector(int x_, int y_, int z_){
    x = x_;
    y = y_;
    z = z_;
}
friend ostream &operator<< (ostream &wyj, Vector &v);
friend istream &operator>> (istream &wej, Vector &v);
};
    /// ===== MATRIX CLASS CONSISTS OF VECTOR OBJECTS
class Matrix{
private:
Vector ** M;
int row;
int col;

public:
Matrix(int col, int row){
    M = new Vector * [row];
    for(int i = 0; i < row; i++){
        M[i] = new Vector[col];
    }
    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            M[i][j] = Vector();
        }
    }
}

friend ostream &operator<< (ostream &wyj, Matrix &M);

};

ostream &operator<< (ostream &wyj, Matrix &M){

for(int i = 0; i < M.row; i++){
    for(int j = 0; j < M.col; j++){
        wyj << M[i][j] << " ";
    }
    wyj<< endl;
}
return wyj;
}

int main(){
    Matrix A(2, 2);
    cout << A[1][1]; // LURD VADAR SAYZ NOOOOOOOOOOOOOOO

}

编辑:&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;过载方法

1 个答案:

答案 0 :(得分:2)

  

为什么在初始化期间使用[] []表示法并不正常   以后?

Matrix的构造函数M中是Vector**。在main() A中有一个Matrix[][] Vector**可以Matrix,但[][]没有意义(除非已定义)。

  

是否有一种中等直接的解决方法?

要使operator[]工作,您需要定义operator[]两次。一次为第一个对象,一次为第一个Matrix返回的对象。

所以在Vector* operator[](size_t index) { return M[index]; } 你可以包括:

name1    score1;
name2    score2;
name3    score3;




import java.io.File;
 import java.io.FileNotFoundException;
   import java.lang.reflect.Array;
   import java.util.ArrayList;
   import java.util.Arrays;
   import java.util.Scanner;

 public class ReadData 
  {

   public static void readData() throws FileNotFoundException 
     {
    File file = new File("data.txt");
     String[] names = new String[50];    
     int[] scores = new int[100]; 
     Scanner scanner = new Scanner(file);
     int l = 0;
     int w = 0;
     int z =0;




     while (scanner.hasNextLine()) { 
     String line = scanner.nextLine();
     String [] words = line.split("\t"); 
     names[l] = words[0]; 
     scores[l] = Integer.parseInt(words[1]);
     //System.out.println(" name: " + names[l] + ", score: " + scores[l]);
     //l++; 
     String line1 = scanner.nextLine();
     String [] words1 = line1.split("\t"); 
     names[w] = words1[0]; 
     scores[w] = Integer.parseInt(words1[1]);
    // w++;
     String line2 = scanner.nextLine();
     String [] words2 = line2.split("\t"); 
     names[z] = words2[0]; 
     scores[z] = Integer.parseInt(words2[1]);
     //z++;
    System.out.println(" name: " + names[l] + ", score: " + scores[l]);
    System.out.println(" name: " + names[w] + ", score: " + scores[w]);
    System.out.println(" name: " + names[z] + ", score: " + scores[z]);





     }
   }
 }