You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++面向对象编程实现矩阵类时读写成员函数失效求助

自定义vector与matrix类矩阵读写功能异常排查

问题背景

  • 开发场景:本科毕业论文配套代码,需实现自定义vector、matrix类层次结构,用于线性方程组求解
  • 异常表现:新增功能后matrix类的元素写入、展示功能失效,同逻辑vector类功能正常;读写函数的cout提示可正常输出,但无法进行数值输入,且未修改过matrix读写相关代码

实现代码

vector类实现(vector.h,不使用模板)

#include <iostream>
using namespace std;
#pragma once

class vector {
protected:
    int n;
    double* vect;

public:
    vector() {
        n = 1;
        vect = new double[n];
        for (int i = 0; i < n; i++) {
            vect[i] = 0;
        }
    }

    vector(int dim) {
        n = dim;
        vect = new double[n];
        for (int i = 0; i < n; i++) {
            vect[i] = 0;
        }
    }

    vector(const vector& v) {
        n = v.n;
        vect = new double[n];
        for (int i = 0; i < n; i++) {
            vect[i] = v.vect[i];
        }
    }

    ~vector() {
        delete[] vect;
    }

    int getsize() {
        return n;
    };

    const vector& operator=(const vector&);
    bool operator== (const vector&) const;
    bool operator!= (const vector&) const;
    void read();
    void display();
    friend ostream& operator<<(ostream&, const vector&);
    friend istream& operator>>(istream&, const vector&);
};

const vector& vector::operator= (const vector& c) {
    if (this == &c)
        return *this;

    if (this != &c) {
        if (n != c.n) {
            delete[] vect;
            n = c.n;
            vect = new double[n];
        }
        for (int i = 0; i < n; i++) {
            vect[i] = c.vect[i];
        }
    }
    return *this;
}

bool vector::operator== (const vector& c) const {
    if (n != c.n)
        return false;
    for (int i = 0; i < n; i++) {
        if (vect[i] != c.vect[i])
            return false;
    }
    return true;
}

bool vector::operator!= (const vector& c) const {
    return !(*this == c);
}

void vector::read() {
    cout << "Insert vector elements:";
    for (int i = 0; i < n; i++) {
        cin >> vect[i];
    }
}

void vector::display() {
    cout << "The vector is: ";
    for (int i = 0; i < n; i++) {
        cout << vect[i];
        cout << " ";
    }
}

ostream& operator<<(ostream& out, const vector& v) {
    for (int i = 0; i < v.n; i++) {
        out << " " << v.vect[i];
    }
    return out;
}

istream& operator>>(istream& in, const vector& v) {
    for (int i = 0; i < v.n; i++) {
        in >> v.vect[i];
    }
    return in;
}

matrix类实现(matrix.h,异常版本)

#include "vector.h"

class matrix {
private:
    int n;
    vector** mat;
public:
    matrix() {
        n = 2;
        mat = new vector * [n];
        for (int i = 0; i < n; i++) {
            mat[i] = new vector[n];
            for (int j = 0; j < n; j++) {
                mat[i][j] = 0;
            }
        }

    }

    matrix(int dim) {
        n = dim;
        mat = new vector * [n];
        for (int i = 0; i < n; i++) {
            mat[i] = new vector[n];
            for (int j = 0; j < n; j++) {
                mat[i][j] = 0;
            }
        }

    }

    matrix(const matrix& m) {
        n = m.n;
        mat = new vector * [n];
        for (int i = 0; i < n; i++) {
            mat[i] = new vector[n];
            for (int j = 0; j < n; j++)
                mat[i][j] = m.mat[i][j];
        }
    }

    ~matrix() {
        for (int i = 0; i < n; i++)
            delete[] mat[i];
        delete[] mat;
    }

    friend ostream& operator<<(ostream&, const matrix&);
    friend istream& operator>>(istream&, const matrix&);
    void read();
    void display();
    const matrix& operator=(const matrix&);

};

const matrix& matrix::operator=(const matrix& m) {
    if (this == &m)
        return *this;

    if (this != &m) {
        for (int i = 0; i < n; i++) {
            delete[] mat[i];
        }
        delete[] mat;
        n = m.n;
        mat = new vector*[n];
        for (int i = 0; i < n; i++) {
            mat[i] = new vector[n];
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                mat[i][j] = m.mat[i][j];
            }
        }
    }
    return *this;
}

ostream& operator<<(ostream& out, const matrix& m) {
    for (int i = 0; i < m.n; i++) {
        out << m.mat[i][0];
        for (int j = 1; j < m.n; j++) {
            out << " " << m.mat[i][j];
        }
        out << endl;
    }
    return out;
}

istream& operator>>(istream& in, const matrix& m) {
    for (int i = 0; i < m.n; i++) {
        for (int j = 0; j < m.n; j++)
            in >> m.mat[i][j];
    }
    return in;
}

void matrix::read() {
    cout << "Insert matrix elements:"<<endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cin >> mat[i][j];
    }
}

void matrix::display() {
    cout << "The matrix is:";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << mat[i][j];
    }
    cout << endl;
}

测试主函数代码

#include "vector.h"
#include "matrix.h"

int main() {
    vector v1(3);
    v1.read();
    v1.display();
    v1.~vector();
    cout << endl;

    matrix m2(2);
    m2.read();
    m2.display();
    m2.~matrix();
    system("pause");
    return 0;
}

问题解决方案

问题核心原因为matrix类的mat成员错误定义为vector**类型,生成了不符合预期的三维结构。调整方案如下:

  1. 将matrix类的mat成员修改为vector*类型
  2. 在vector类中新增初始化函数用于初始化vector数组
    调整后matrix类的读写、展示功能恢复正常。

内容的提问来源于stack exchange,提问作者ryuukia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 16:27:03