我正在编写一个简单的头文件,它可以创建一个动态的2d数组,并在行和col中放置0,打印数组,并删除数组。
在Step中,当逐步执行时,2d数组被初始化,它将0放在那里,但是当my_array.Print_Array();调用时,编译器会跳过它。
当我尝试从主文件打印数组时,它失败了。任何帮助都会很感激。
HEADER FILE:
class twoD_Array
{
public:
int **Array;
int *col, *row;
int size_col, size_row;
twoD_Array(int, int);
~twoD_Array();
void Print_Array();
};
twoD_Array::twoD_Array(int size_c, int size_r)
{
size_col = size_c;
size_row = size_r;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
Array[i][j] = 0;
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i<size_col; y_i++)
{
for (int x_i = 0; x_i<size_col; x_i++)
std::cout << Array[y_i][x_i];
std::cout << std::endl;
}
}
twoD_Array::~twoD_Array()
{
for (int i = 0; i < size_row; i++)
delete[] Array[i];
delete[] Array;
}
主档案:
#include "stdafx.h"
#include <iostream>
#include "2D_Array.h"
int main()
{
int x, y;
std::cout << "how many x variables?" << std::endl;
std::cin >> x;
std::cout << "how many y variables?" << std::endl;
std::cin >> y;
twoD_Array my_array(x, y);
my_array.Print_Array();
return 0;
}
答案 0 :(得分:3)
您正在构造函数中使用局部变量,但您正在使用Print_Array
方法中的成员变量,这些变量未初始化。您需要在提供它们的构造函数中初始化成员变量size_col
和size_row
。另外要指出的是,在Print_Array
方法中,您使用size_col
代替size_row
进行x_i
循环,这看起来像是一个逻辑错误。
我重写了构造函数,Print_Array
看起来像这样:
twoD_Array::twoD_Array(int size_col, int size_row)
{
this->size_col = size_col;
this->size_row = size_row;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
{
Array[i][j] = 0;
}
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i < size_col; y_i++)
{
for (int x_i = 0; x_i < size_row; x_i++)
{
std::cout << Array[y_i][x_i];
}
std::cout << std::endl;
}
}
答案 1 :(得分:3)
在
twoD_Array::twoD_Array(int size_col, int size_row)
int size_col
为名为size_col
的构造函数变量定义了一个新的临时和局部。这个size_col
与成员变量size_col
无关,因为它们具有相同的名称,所以局部变量隐藏了成员变量。
最终结果在Print_Array
中,成员变量size_col
尚未设置为任何内容,因此Crom只知道会发生什么。
解决方案:
设置成员变量:
twoD_Array::twoD_Array(int col, int row): size_col(col), size_row(row)
冒号(:)告诉编译器Member Initializer List即将到来。 Member Initializer List允许您在进入构造函数体之前初始化类成员。当你有一个没有默认构造函数的成员变量或需要昂贵的初始化而你不想被迫做两次时,这一点非常重要。它&#39;还允许您初始化基类。
请注意,我还更改了参数的名称,以防止将来混淆。
当我们来到这里时,让我们通过严肃地问What is The Rule of Three?来解决可能成为OP的下一个问题。单击链接。为您节省大量的调试费用。