C++函数在不同的类中不起作用

C++ function not working in different class

本文关键字:不起作用 函数 C++      更新时间:2023-10-16

我真的很努力使用函数和类,在VS上,我得到一个"Matrix::Matrix()"是无法访问的错误,我只是无法弄清楚为什么。

我正在尝试学习函数和类,但只是不明白!该程序基本上在一个名为Matrix的类中使用构造函数和析构函数,并创建一个"矩阵"。我现在正在尝试使用此矩阵类中的函数从构造的矩阵内部获取值,它将返回正确的值,但不明白为什么我会收到此错误。

#include <iostream>
using namespace std;
class Matrix
{
    Matrix();
private:
    int M;
    int N;
    double *data;

    int get(int i, int j){
        return data[i*N+j];
    }
    //CONSTRUCTOR
public:
    Matrix(int sizeR, int sizeC,double * input_data)
    {
        M=sizeR;//Rows
        N=sizeC;//Columns
        data = new double[M*N];//creation of 1D array, uses m&n values
        cout<<"nMatrix::Matrix(int sizeR, int sizeC, double * input_data) is invokednn";

        //ENTER DATA INTO MATRIX HERE:
        for(int i=0;i<M*N;i++)//Loops for every data entry into 1D array, uses r&c as referenece to size
            data[i] = input_data[i];//Accesses each value at specific location, inputs value 'val'
        for(int i=0;i<M*N;i++)//Loops for every data entry into 1D array
            cout<<data[i]<<" ";
    }

    //DECONSTRUCTOR
    ~Matrix(){
        //delete data
        delete []data;
        cout<<"nnMatrix::~Matrix() is invokednn";
    }
};
int main()
{
    int sizeR, sizeC, g1, g2;
    g1 = 2;
    g2 = 2;
    Matrix M1;
    cout<<"Enter No. Rows: ";
    cin>>sizeR;
    cout<<"Enter No. Columns: ";
    cin>>sizeC;
    double * input_data;
    input_data = new double[sizeR*sizeC];

    //INPUTS VALUES TO ARRAY
    for(int i=0;i<sizeR*sizeC;i++)//Loops for every row
        input_data[i] = i+1*input_data[i-1];
    Matrix(sizeR, sizeC, input_data);
    cout<<"Find value at row: ";
    cin>>sizeR;
    cout<<"Find value at column: ";
    cin>>sizeC;
    M1.get(g1, g2);

}

C++ 中类的默认访问修饰符是私有的,因此如果在构造函数Matrix()的定义之前没有显式使用 public: 访问修饰符,那么它将被视为私有的。

您希望

使用您提供的构造函数创建M1对象。

Matrix(sizeR, sizeC, input_data);不会创建M1对象。

您需要执行Matrix M1(sizeR, sizeC, input_data);或创建具有公共可访问性的默认构造函数。

此外(正如有人指出的那样),如果Matrix::get()不是公开的,M1.get(...)也会导致错误。

只需将默认构造函数(声明/定义)放在类的public部分中:

class Matrix {
public: // <<<<
    Matrix() {
    }
    Matrix(int sizeR, int sizeC,double * input_data) { 
        // ...
    }
    // ...
};

除非另有指定,否则class的默认作用域策略是private

没有

定义不带参数的构造函数,并且进一步声明private 。因此,调用

Matrix M1;

失败。只需在类中提供一个定义,例如

Matrix() {}

并使其公众可访问,它将正常工作。


编辑:get函数也需要是公开的。接下来,这个原始数组是一件坏事,它会导致双重无损坏错误。请改用std::vector。我想这变成了代码审查。请参阅此处,了解仍然快速肮脏但有所改进的实现。