C ++在头文件中声明函数原型的麻烦

时间:2015-12-29 20:07:21

标签: c++ class header-files

我已经在MatrixTest.cpp函数中使用了以下代码:

Matrix matrix = Matrix::Zeros(2,4)

目的是“用静态零创建一个2x4的零矩阵”,我需要能够在头文件“Matrix.h”中添加一些东西,它允许“MatrixTest.cpp”编译为上面的代码。到目前为止,这是我头文件中的代码:

#ifndef MATRIX_H_
#define MATRIX_H_

class Matrix {
protected:
    // These are the only member variables allowed!
    int noOfRows;
    int noOfColumns;
    double *data;

    int GetIndex (const int rowIdx, const int columnIdx) const;

public:
    Matrix (const int noOfRows, const int noOfCols);
    Matrix (const Matrix& input);
    Matrix& operator= (const Matrix& rhs);
    ~Matrix ();

    Matrix Zeros(const int noOfRows, const int noOfCols);
};

#endif /* MATRIX_H_ */

这给出了我的.cpp文件中的错误,我无法在没有对象的情况下调用成员函数Matrix Matrix :: Zeros(int,int)。但是肯定Zeros是我的对象而我的Matrix类是我的类型?

如果我将头文件中的代码更改为以下内容:

static Zeros(const int noOfRows, const int noOfCols);

然后我在我的.h文件中出现错误,说“禁止声明'Zeros'没有类型,并且我的.cpp文件中有错误说”从'int'转换为非标量类型'Matrix'请求“< / p>

我很困惑,因为我认为我的类型是Matrix,因为它出现在Matrix类下面,并且因为Matrix :: Zeros(2,4)遵循构造函数Matrix(const int noOfRows,const int noOfCols)那么就不存在从'int'到非标量类型的转换问题。

有人可以帮忙解决这个问题,因为我似乎在这些错误之间来回走动吗?

2 个答案:

答案 0 :(得分:3)

该功能的签名应为

static Matrix Zeros(const int noOfRows, const int noOfCols);

static关键字不是返回类型,Matrix是。相反,static关键字表示您不需要Matrix的实例来调用该方法,而是可以将其称为

Matrix matrix = Matrix::Zeros(2,4)

要明确的是,如果您使用单词static,那么您必须执行类似

的操作
Matrix a{};
Matrix matrix = a.Zeros(2,4);

但您可以看到Zeros方法不依赖于a的状态,因此该方法有意义为static

答案 1 :(得分:0)

由于此处static不是返回类型,并且您的函数返回Matrix,这将是您的返回类型。

将功能签名更改为 static Matrix Zeros(const int noOfRows, const int noOfCols);应该做到这一点。