2014-11-02 57 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