This question already has answers here:
What is The Rule of Three?

(8个答案)


5年前关闭。




我在c++和其他面向对象的整体语言方面相对较新(已经完成了一个学期的C类类(class),现在我正在学习c++类)。我在通过同类同学的类制作动态分配的二维数组时遇到问题。

该练习本身将是:



经过一段时间尝试弄清楚为什么它不能正常工作之后,我们的代码当前是这样的:
obs:“Matriz”是我们用语言称呼二维数组的方式。

Matriz.h
#pragma once
class Matriz{
    public:
        int l, c;
        float** matriz;
        void setL(int _l);
        void setC(int _c);
        int getL();
        int getC();
        Matriz();
        Matriz(int _l, int _c);
        Matriz(Matriz& m);
        float **getMatriz();
        float getElement(int pL, int pC);
        void setElement(int pL, int pC, float value);
    };

Matriz文件
 #include "Matriz.h"

Matriz::Matriz(){
    l = c = 0;
    matriz = new float*[l];

    for (int i = 0; i<l; i++) {
        matriz[l] = new float[c];
    }
}

Matriz::Matriz(Matriz& m){
    l = m.getL();
    c = m.getC();
    matriz = new float*[l];

    for (int i = 0; i<l; i++) {
        matriz[l] = new float[c];
    }

    for (int i = 0; i<l; i++) {
        for (int j = 0; j<l; j++) {
            matriz[i][j] = m.matriz[i][j];
        }
    }

}

Matriz::Matriz(int _l, int _c){
    l = _l;
    c = _c;

    matriz = new float*[l];

    for (int i = 0; i<l; i++) {
        matriz[l] = new float[c];
    }
}

float **Matriz::getMatriz(){
    return matriz;
}

int Matriz::getC(){
    return c;
}

int Matriz::getL(){
    return l;
}

void Matriz::setC(int _c){
    c = _c;
}
void Matriz::setL(int _l){
    l = _l;
}

float Matriz::getElement(int pL, int pC){
    return matriz[pL][pC];
}

void Matriz::setElement(int pL, int pC, float value){
    matriz[pL][pC] = value;
}

main.cpp
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int l = 2, c = 2;
    float **m;
    m = new float*[l];

    for (int i=0; i<2; i++) {
    m[i] = new float[c];
    }

    Matriz a(2, 2);
    a.setC(2);
    a.setL(2);

    cout << " c = " << a.getC() << " l= " << a.getL() << "\n";

    for (int i = 0; i<l; i++) {
        for (int j = 0; j<c; j++) {
            a.setElement(i, j, 0);
            cout << " Elemento " << 1 << " " << 1 << " = " << a.getElement(l, c) << "\n";
        }
    }

    a.setElement(0, 0, 1); // <- this is just for testing



    system("pause");
}

iostream和类 header 都包含在stdafx.h中

在MSVS 2013上进行编译的时间为
void Matriz::setElement(int pL, int pC, float value){
    matriz[pL][pC] = value;
}

而且我们不确定为什么调试器会给我
“ConsoleApplication15.exe中0x01092E27处未处理的异常:0xC0000005:访问冲突写入位置0xCDCDCDD1。

但是,我们怀疑数组的某些内容是错误的,并且当程序尝试将某些内容写入其元素时,它根本不存在/无法达到,从而无法更改该特定元素的值。

我们非常感谢您提供的任何帮助或建议,可以随意提出改进或编码建议,学习新事物总是一件好事=)。

最佳答案

我认为您的错误实际上在这里:a.getElement(l, c)lc是数组的界限,例如2,此时最大索引只能是1。

另一个严重缺陷(pointed out by twsaef)是您的构造函数:

for (int i = 0; i<l; i++) {
    matriz[l] = new float[c];
}

应该
for (int i = 0; i<l; i++) {
    matriz[i] = new float[c];
}

当我这样做时,这是多余的:
Matriz a(2, 2);
a.setC(2);
a.setL(2);

因为Matriz的构造函数将为您设置lc

另外,您打算如何做:
float **m;
m = new float*[l];

for (int i=0; i<2; i++) {
m[i] = new float[c];
}

目前,它什么都没用。

然后,作为PaulMcKenzie pointed out,当Matriz实例超出范围时,动态分配的内存将发生什么?

作为Matt McNabb pointed out,如果在调用MatrizsetC()时需要调整setL()实例的大小,该怎么办?目前,它们仅设置成员变量,而对内存不执行任何操作。

10-07 15:35