设计 .h 和 .cpp 文件 C++:错误

Posted

技术标签:

【中文标题】设计 .h 和 .cpp 文件 C++:错误【英文标题】:Designing .h and a .cpp file C++ : Errors 【发布时间】:2014-11-02 16:45:55 【问题描述】:

我正在尝试制作一个矩阵程序,该程序使用整数向量的向量制作一个 n*m 整数矩阵。但是我在这样做时遇到了麻烦,因为我对 C++ 还很陌生。我已经开始实施我的程序,但是我遇到了一大堆我无法弄清楚原因的错误。另外,这是我第一次使用 .h 和向量,所以请保持温和 :)。

矩阵.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

矩阵.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;
    

好的,以上是我之前代码的固定版本,但现在我收到了这个错误:

错误:

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 ‘&’ ?)

【问题讨论】:

您不需要在标头中包含 #include&lt;iostream&gt;,它会大大减慢您的编译时间,因为 iostream 是一个巨大的标头。 重要信息:Naming Include Guards 和 What are the rules about using an underscore in a C++ identifier? 你不应该把using namespace std;放在头文件的全局部分(最好不要放在其他任何地方)。 @Galik,所以我应该删除它,但我需要将它包含在 .h 文件的其他任何地方吗? 你可以把它放在你的类定义中,或者把你的类放在它自己的命名空间中并添加到那里。或者您可以使用std:: 限定您的std::vector 【参考方案1】:

这里有一些问题:

    您将包含保护和类命名为相同的名称。因此,预处理器将通过将Matrix 替换为空字符串而完全搞砸。替换:

    #ifndef Matrix
    #define Matrix
    

    与:

    #ifndef Matrix_h
    #define Matrix_h
    

    或其他任何东西。尾随 _H 和全部大写字母是避免命名冲突的常见权宜之计。例如,您可以使用:

    #ifndef MATRIX_H
    #define MATRIX_H
    

    您忘记导入 Vector 类。在Matrix.h顶部添加:

    #include <vector>
    

    您不能使用matrix(0,0,0,0,0,0) 初始化向量向量。只是省略那部分。 vector 中的 int 元素已经默认为零。

    您没有提供接受整数和向量的构造函数,这将在Matrix.cpp 的第 20 行使用:

    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);
        
    
    

【讨论】:

但不要使用双下划线或下划线后跟大写字母,因为这些是保留名称。 那看起来还是双下划线 :( @BenVoigt 前导下划线保留,尾随下划线很好,AFAIK。也许您正在寻找旧/缓存版本?还是我错了? 见What are the rules about using an underscore in a C++ identifier? 好的,谢谢,我将如何在构造函数中初始化多维向量的大小?【参考方案2】:

当您定义Matrix 时,您将其定义为空,因此class Matrix 的计算结果为class,以及类本身内所有出现的Matrix

这是因为预处理器在编译代码之前运行 #if 块,并将找到的所有 #defines 替换为给定的字符串,在您的情况下为空字符串。

【讨论】:

【参考方案3】:

请先更改标题栏:-

#ifndef Matrix
#define Matrix

它类似于类名。让它像

#ifndef __MATRIX_
#define __MATRIX_

【讨论】:

但不要使用双下划线或下划线后跟大写字母,因为这些是保留名称。 @a22asin:是的,它会...直到您遇到使用M 作为变量名的代码,然后突然中断。我对该问题发表了评论,并附有良好建议的链接。

以上是关于设计 .h 和 .cpp 文件 C++:错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 链接错误与 Linux 上的多个定义

错误 LNK2019:未解析的外部符号

使用g ++在同一目录下使用.cpp编译.h,错误

字符串的 C++ 问题

模块导入 (C++) --- 错误“模块文件映射无效”

C++ 错误:未定义对“main”的引用