2014-11-02 81 views
0

我正在尝试制作一个矩阵程序,它使用整数向量向量生成n * m整数矩阵。但是我很难做到这一点,因为我对C++相当陌生。我已经开始实施我的程序,但是我收到了一大堆错误,我无法弄清楚原因。另外,这是我第一次使用.h和向量,所以请温柔:)。设计.h和一个.cpp文件C++:错误

Matrix.h

#ifndef MATRIX_H 
#define MATRIX_H 

#include<vector> 
using namespace std; 

class Matrix{ 
    public: 
     Matrix(); 
     Matrix(int r, int c); 
     void setRow(vector<int> row, int r); 
     void setColumn(vector<int> col, int c); 
     int getRow(); 
     int getCol(); 
     void output(); 
     double average(); 
    private: 
     int row, column; 
     vector< vector<int> > matrix; 
}; 

#endif 

Matrix.cpp

#include "Matrix.h" 
#include<iostream> 
#include<vector> 
using namespace std; 

int main(){ 
    int row,column; 
    cout << "Enter number of rows: "; 
    cin >> row; 
    cout << "Enter number of column: "; 
    cin >> column; 
    Matrix matrix(row,column); 
    matrix.output(); 

} 

Matrix::Matrix():row(3), column(3){ 
    matrix = vector<vector<int> >(row); 
    for (int i = 0; i < row; i++){ 
     matrix[i] = vector<int>(column); 
    } 
} 

Matrix::Matrix(int r, int c): row(r), column(c){ 
    matrix = vector<vector<int> >(r); 
    for (int i = 0; i < r; i++){ 
     matrix[i] = vector<int>(c); 
    } 
} 

void Matrix::setRow(vector<int> row, int r){ 
    if (r <= row){ 
     if (row.size <= column){ 
      for (int i = 0; i < row.size; i++){ 
       matrix[r][i] = row[i]; 
      } 
     } 
    } 
} 

void Matrix::setColumn(vector<int> col, int c){ 
    if (c <= column){ 
     if (col.size <= row){ 
      for (int i = 0; i < col.size; i++){ 
       matrix[i][c] = col[i]; 
      } 
     } 
    } 
} 

void Matrix::output(){ 
    for (int i = 0; i < row; i++){ 
     for (int j = 0; j < column; j++){ 
      cout << matrix[i][j]; 
     } 
     cout<< endl; 
    } 
} 

OK所以上面是我以前的代码固定的版本,但现在我得到这个错误:

错误:

Matrix.cpp: In member function ‘void Matrix::setRow(std::vector<int, std::allocator<int> >, int)’: 
Matrix.cpp:32: error: no match for ‘operator<=’ in ‘r <= row’ 
Matrix.cpp:33: error: invalid use of member (did you forget the ‘&’ ?) 
Matrix.cpp:34: error: invalid use of member (did you forget the ‘&’ ?) 
Matrix.cpp: In member function ‘void Matrix::setColumn(std::vector<int, std::allocator<int> >, int)’: 
Matrix.cpp:43: error: invalid use of member (did you forget the ‘&’ ?) 
Matrix.cpp:44: error: invalid use of member (did you forget the ‘&’ ?) 
+1

您不需要在头文件中包含'#include ',并且由于'iostream'是一个非常大的头文件,所以它会减慢你的编译时间。 – sjdowling 2014-11-02 16:53:10

+0

重要信息:[命名include防范](http://stackoverflow.com/q/4867559/103167)和[?什么是有关在C++标识符使用下划线的规则](http://stackoverflow.com/q/228783/103167) – 2014-11-02 16:58:59

+0

你不应该在头文件的全局部分放置'using namespace std;'(最好不要放在其他地方)。 – Galik 2014-11-02 17:22:24

回答

1

你这里有几个问题:

  1. 您指定的包括后卫和类具有相同的名称。因此,预处理器将通过用空字符串替换Matrix而完全搞乱。替换:

    #ifndef Matrix 
    #define Matrix 
    

    有:

    #ifndef Matrix_h 
    #define Matrix_h 
    

    或其他任何东西。尾随_H和ALL CAPS是避免命名冲突的常用手段。例如,您可以使用:

    #ifndef MATRIX_H 
    #define MATRIX_H 
    
  2. 您忘记了导入Vector类。添加在Matrix.h顶部:

    #include <vector> 
    
  3. 你不能matrix(0,0,0,0,0,0)初始化向量的向量。只要省略那部分。 intvector中的元素已经默认为零。

  4. 你没有提供它接受一个整数和一个向量,这将在第20行中使用的Matrix.cpp一个构造:

    Matrix::Matrix(int r, int c): row(r), column(c){ 
        matrix(r, vector<int>(c)); 
        // .... 
    } 
    

    修复它喜欢:

    Matrix::Matrix(int r, int c): row(r), column(c){ 
        matrix = vector<vector<int> >(r); 
        for (int i = 0; i < r; i++){ 
         matrix[i] = vector<int>(c); 
        } 
    } 
    
+1

但不要使用双下划线或下划线后跟大写字母,因为这些是保留名称。 – 2014-11-02 16:56:49

+0

@BenVoigt是的,修正,谢谢。 – 2014-11-02 17:00:06

+0

这仍然看起来像一个双下划线:( – 2014-11-02 17:02:12

1

当你定义Matrix时,你将它定义为空,所以class Matrix{评估为class{,以及类内部的所有Matrix发生。

这是因为预编译器在编译代码之前先运行#if块,并将发现#define的所有出现的代码替换为给定的字符串,这是您的情况,为空字符串。

1

请先更改标题gaurds: -

#ifndef Matrix 
#define Matrix 

它类似于类的名称。使它像

#ifndef __MATRIX_ 
#define __MATRIX_ 
+1

但不要用双下划线或下划线其次是大写字母,因为这些被保留名。 – 2014-11-02 16:55:30

+0

会#ifndef M工作吗? – a22asin 2014-11-02 16:58:58

+2

@ a22asin:是的,直到你遇到使用'M'作为变量名的代码,并突然中断。我留下了对这个问题的评论,并提供了很好的建议。 – 2014-11-02 17:03:52