This question already has answers here:
What is The Rule of Three?
(8个答案)
5年前关闭。
我在c++和其他面向对象的整体语言方面相对较新(已经完成了一个学期的C类类(class),现在我正在学习c++类)。我在通过同类同学的类制作动态分配的二维数组时遇到问题。
该练习本身将是:
经过一段时间尝试弄清楚为什么它不能正常工作之后,我们的代码当前是这样的:
obs:“Matriz”是我们用语言称呼二维数组的方式。
Matriz.h
Matriz文件
main.cpp
iostream和类 header 都包含在stdafx.h中
在MSVS 2013上进行编译的时间为
而且我们不确定为什么调试器会给我
“ConsoleApplication15.exe中0x01092E27处未处理的异常:0xC0000005:访问冲突写入位置0xCDCDCDD1。
但是,我们怀疑数组的某些内容是错误的,并且当程序尝试将某些内容写入其元素时,它根本不存在/无法达到,从而无法更改该特定元素的值。
我们非常感谢您提供的任何帮助或建议,可以随意提出改进或编码建议,学习新事物总是一件好事=)。
应该
当我这样做时,这是多余的:
因为
另外,您打算如何做:
目前,它什么都没用。
然后,作为PaulMcKenzie pointed out,当
作为Matt McNabb pointed out,如果在调用
(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)
。 l
和c
是数组的界限,例如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
的构造函数将为您设置l
和c
。另外,您打算如何做:
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,如果在调用
Matriz
或setC()
时需要调整setL()
实例的大小,该怎么办?目前,它们仅设置成员变量,而对内存不执行任何操作。10-07 15:35